2014-05-15 35 views
0

好吧,所以我使用WinSockets2来制作一个非常简单的服务器客户端应用程序。我有我的套接字初始化,我试图让服务器成为多用户。我几乎100%肯定,到目前为止,服务器套接字已正确形成,并且我100%确定客户端套接字是正确的,因为我使用了另一台服务器。虽然,recv函数失败,错误WSAENOTSOCK。有问题的代码:发送一个有效的套接字后WSAENOTSOCK错误

unsigned __stdcall client(void *data) { 
    SOCKET clientSocket = (SOCKET)data; 

    char inBuffer[DEFAULT_BUFLEN]; 

    int inBytes = SOCKET_ERROR; 

    ZeroMemory(inBuffer, sizeof(inBuffer)); //make sure the buffer is 0 

    inBytes = recv(clientSocket, inBuffer, sizeof(inBuffer), 0); 
    printf("Client said: %s and there's this also %d\n", inBuffer, inBytes); 

    if (inBytes == SOCKET_ERROR) { 
     printf("eek! Something went wrong! %ld\n", WSAGetLastError()); 
    } 
    return 0; 
} 

和它下面一点点......

bool serverOn = true; 
    while (clientSocket = accept(listenSocket, NULL, NULL) && serverOn) { 
     //http://stackoverflow.com/questions/15185380/tcp-winsock-accept-multiple-connections-clients 
     unsigned threadID; 
     HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &client, (void*)clientSocket, 0, &threadID); 
    } 

    if (iResult = shutdown(clientSocket, SD_SEND) == SOCKET_ERROR) { //clean up and end everything 
     printf("shutdown failed: %d\n", WSAGetLastError()); 
     closesocket(clientSocket); 
     WSACleanup(); 
     return 1; 
    } 

    closesocket(clientSocket); 
    WSACleanup(); 

    return 0; 
} 

如果需要任何其他代码,请询问。谢谢!

+0

如果任何其他情况必须符合重现请张贴。谢谢。 - 什么时候发生?当时是否设置了“serverOn”标志?至少有一种气味:你使用套接字创建每个线程,但是当while离开时,套接字(可能是0,但不是INVALID_SOCKET)是'shutdown'和'close'd。我期望处理'listenSocket'。但是关于上下文的信息很少...... – harper

回答

-1

好的,经过很多反复试验后我找到了答案。在这个代码块:

bool serverOn = true; 
    while (clientSocket = accept(listenSocket, NULL, NULL) && serverOn) { 
     //http://stackoverflow.com/questions/15185380/tcp-winsock-accept-multiple-connections-clients 
     unsigned threadID; 
     HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &client, (void*)clientSocket, 0, &threadID); 
    } 

    if (iResult = shutdown(clientSocket, SD_SEND) == SOCKET_ERROR) { //clean up and end everything 
     printf("shutdown failed: %d\n", WSAGetLastError()); 
     closesocket(clientSocket); 
     WSACleanup(); 
     return 1; 
    } 

    closesocket(clientSocket); 
    WSACleanup(); 

    return 0; 
} 

while (clientSocket = accept(listenSocket, NULL, NULL) && serverOn) {应该分成两行,

while (serverOn) { 
     clientSocket = accept(listenSocket, NULL, NULL); 

我猜它是与变量的作用域。快乐的编码家伙!

+0

但是这并不改变变量的范围。 – harper

相关问题