【问题标题】:WSAGetLastError 10038 in a C++ clientC++ 客户端中的 WSAGetLastError 10038
【发布时间】:2016-02-16 21:56:11
【问题描述】:

我创建了一个连接到 C++ 服务器的 C++ 客户端。 它连接并正确发送数据到服务器。 我创建了一个单独的线程来从服务器接收数据,这是我无法弄清楚的问题。 我收到此错误:

WSAGetLastError 10038

我发现这个错误是因为描述符不是套接字。

服务器发送方法正常,我用telnet客户端测试。

这是我的客户端代码:

#include <winsock2.h>
#include <windows.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <conio.h>
#include<iostream>

using namespace std;
int hsock;
void *SocketHandler(void*);

int main(int argv, char** argc){

    //The port and address you want to connect to
    int host_port= 2000;//1101;
    char* host_name="10.188.126.198";
    pthread_t recept;


    //Initialize socket support WINDOWS ONLY!
    unsigned short wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 2, 2 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 || ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 )) {
        fprintf(stderr, "Could not find useable sock dll %d\n",WSAGetLastError());
        return 0;
    }

    //Initialize sockets and set any options

    int * p_int ;
    hsock = socket(AF_INET, SOCK_STREAM, 0);
    if(hsock == -1){
        printf("Error initializing socket %d\n",WSAGetLastError());
        return 0;
    }

    p_int = (int*)malloc(sizeof(int));
    *p_int = 1;
    if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
        (setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
        printf("Error setting options %d\n", WSAGetLastError());
        free(p_int);
        return 0;
    }
    free(p_int);

    //Connect to the server
    struct sockaddr_in my_addr;

    my_addr.sin_family = AF_INET ;
    my_addr.sin_port = htons(host_port);

    memset(&(my_addr.sin_zero), 0, 8);
    my_addr.sin_addr.s_addr = inet_addr(host_name);

    int *csock ;
            csock = (int*)malloc(sizeof(int));

    if( (*csock =connect( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr))) == SOCKET_ERROR ){
        fprintf(stderr, "Error connecting socket %d\n", WSAGetLastError());
        return 0;
        }

    cout<<"Client connect to :"<< htons(host_port)<<endl;

    //Create thread to receive data from the server
// the problem is here as I think
    pthread_create(&recept,NULL,SocketHandler,(void *)csock);


/// Send data to the server    
    char buffer[1024];
    int buffer_len = 1024;
    int bytecount;

    int c;

    while(true){
             memset(buffer, '\0', buffer_len);
            for(char* p=buffer ; (c=getch())!=13 ; p++){
                printf("%c", c);
                *p = c;
            }


                if( (bytecount=send(hsock, buffer, strlen(buffer),0))==SOCKET_ERROR){
                    fprintf(stderr, "Error sending data %d\n", WSAGetLastError());
                    return 0;
                }
                printf("Sent bytes %d\n", bytecount);

    }

    closesocket(hsock);

return 0;

}
void *SocketHandler(void* lp){
    int *csock= (int*)lp;
    cout<<"Start Listening Thread"<<endl;

    char buffer[1024];
    int buffer_len = 1024;
    int bytecount;
        memset(buffer, 0, buffer_len);

    while(1){

    memset(buffer, 0, buffer_len);
    if((bytecount = recv(*csock, buffer, buffer_len, 0))==SOCKET_ERROR){
        fprintf(stderr, "Error receiving data %d\n", WSAGetLastError());
        break;
    }
        printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);

    }

    free(csock);
    return 0;
}

【问题讨论】:

  • 检查connect的返回值:如果没有出错,connect返回零。否则,它返回 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。您将其分配给 *csock,然后对其执行 recv
  • 客户端如我所说正确连接,可以向服务器发送数据。问题出在 recv 方法的线程上
  • 没错。 connect 成功,返回 0。所以:*csock = 0; 然后你有 if((bytecount = recv(*csock, buffer,... 你在 0 上调用 recv,这通常是 stdin
  • 是的,我知道现在出了什么问题,谢谢@CristiFati
  • NP,希望你成功了 :)

标签: c++ sockets


【解决方案1】:

函数“连接”返回结果,而不是套接字句柄 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737625%28v=vs.85%29.aspx)。将其更改为:

...
if (connect(hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == SOCKET_ERROR) {
    fprintf(stderr, "Error connecting socket %d\n", WSAGetLastError());
    return 0;
}

*csock = hsock;
...

【讨论】:

    【解决方案2】:

    你发送给线程的参数是csock...

    int *csock ;
    csock = (int*)malloc(sizeof(int));
    ...
    pthread_create(&recept,NULL,SocketHandler,(void *)csock);
    

    然后您将csock 用作套接字(在线程中)...

    int *csock= (int*)lp;
    ...
    if((bytecount = recv(*csock, buffer, buffer_len, 0))==SOCKET_ERROR) {
    

    我认为您需要使用hsock 作为您的套接字,而不是*csock...

    顺便说一句: 在 Windows 中,您应该将其称为 SOCKET 而不是 int...

    希望对你有帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2011-08-09
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多