2014-05-15 34 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

相關問題