2016-01-20 90 views
-1

我刚将一些套接字代码从Linux移到了Windows。经过一些更改以使代码在Windows上工作后,我的客户端似乎在接受函数中等待并且没有从服务器接收我的数据。卡在接受套接字

的代码为我的客户端版本

WSADATA wsa; 
    SOCKET sock = 0; 
    struct sockaddr_in server; 
    packageLength = 64;//We don't need more to get all the information 
    char * buffer = new char[packageLength]; 

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { this->Die("Failed to WSA startup");} 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { 
     this->Die("Failed to create socket"); 
    } 

    memset(&server, 0, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port = htons(55555); 

    if (bind(sock, (struct sockaddr *) &server, sizeof(server)) == SOCKET_ERROR) { 
     this->Die("Failed to bind the server socket"); 
    } 
    if (listen(sock, 1) < 0) { 
     this->Die("Failed to listen on server socket"); 
    } 

    SOCKET clientSocket = 0; 
    struct sockaddr_in client; 
    int size = sizeof(sockaddr_in); 

    std::cout << "Waiting for server" << std::endl; 
    clientSocket = accept(sock, (struct sockaddr *) &client, &size); //Stands here and wait 
    if (clientSocket == INVALID_SOCKET) { 
     this->Die("Failed to accept client"); 
    } 
    //Never reach here 
    std::cout << "Server accepted" << std::endl; 

和服务器端的代码

WSADATA wsa; 
    SOCKET sock = 0; 
    struct sockaddr_in sender; 
    char* buffer = new char[this->packageLength]; 

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { 
     this->Die("Failed to WSA startup"); 
    } 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { 
     printf("Could not create socket : %d", WSAGetLastError()); 
     this->Die("Failed to create socket"); 
    } 

    memset(&sender, 0, sizeof(sender)); 
    sender.sin_family = AF_INET; 
    sender.sin_addr.s_addr = inet_addr(ip.c_str()); 
    sender.sin_port = htons(this->port); 

    //Connect to the recevier 
    if (bind(sock, (struct sockaddr *) &sender, sizeof(sender)) == SOCKET_ERROR) { 
     this->Die("Failed to connect to recevier"); 
    } 

    //Send all data 
    int amountLeft = (int)amount; 
    while (amountLeft > 0) { 
     //Send on chunk of data. //Packagesize is actually the size of the data portion 
     std::cout << "Sent" << std::endl; 
     send(sock, data, strlen(data), 0); 

     amountLeft -= packageLength; 
    } 

    std::cout << "All data is sent, socket is now closed" << std::endl; 

服务器发送数据,但客户不接受它。我已经检查了端口是否正确,并且它是本地主机,所以使用的IP是127.0.0.1

+0

为什么客户端'listen'&'accept'?为什么他们中没有人连接? – Amit

回答

1

我刚刚将一些套接字代码从Linux移到了Windows。

此代码从未在任何平台上工作过。移动非工作代码毫无意义。

我的客户...

没有客户端。这不是客户端和服务器。它是两台服务器。

...似乎在等待accept()函数。

accept()函数中没有等待的客户端。 accept()适用于服务器,而不是客户端。你在这里认真地回到前面。服务器应该呼叫listen()accept();客户端应该呼叫connect().