2016-05-17 5 views
0

Ich schreibe einen Winsock-Server in C++, der Daten von einem Analog-Digital-Wandler sammelt und einen Server ausführt, damit sich Clients anmelden und die Daten anfordern können. Ich habe derzeit mindestens drei Threads laufen (Haupt-Thread, Analog-Input-Thread und ein Server-Thread), und der Server spinnt einen neuen Thread für jeden verbundenen Client. Ich teste den Code jetzt und akzeptiert dreimal Verbindungen von einem Client, verweigert aber die Verbindung beim vierten Versuch. Dies ist die while-Schleife, die ich verwende, um Verbindungen zu empfangen und Threads für jeden Client auszulagern. Wenn der Server Verbindungen verweigert, befindet er sich immer noch in dieser Schleife. Ich kenne einige Debugging-Anweisungen.Winsock-Server in C++ Verbindungen nach drei Clients verweigern

while (serverActive) { 
     //Accept client sockets as long as the server remains active 
     ClientSocket = accept(ListenSocket, NULL, NULL); 
     if (ListenSocket == INVALID_SOCKET) { 
      printf("Accept failed"); 
      closesocket(ListenSocket); 
      WSACleanup(); 
      return 1; 
     } 
     std::thread clientThr(clientHandlerThread, ClientSocket); 
     clientThr.detach(); 
    } 

Dies ist der Code für den Client-Handler-Thread. Alle if-elsif-else-Anweisungen in der Mitte sind nur das Protokoll, das ich für die Kommunikation mit Clients eingerichtet habe. Der Tester-Client-Code, den ich verwende, schließt den Socket von der Client-Seite. Ich habe einige andere Beiträge gelesen, in denen es heißt, dass dies manchmal das Problem ist, aber in diesem Fall scheint es nicht das Problem zu sein. Irgendwelche Gedanken?

int clientHandlerThread(SOCKET client) { 
    int iResult, iSendResult; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int recvbuflen = DEFAULT_BUFLEN; 

    char * p_m6 = reinterpret_cast< char *>(&data_ai_SC1Mod6[0]); 
    char * p_m7 = reinterpret_cast< char *>(&data_ai_SC1Mod7[0]); 
    char * p_m8 = reinterpret_cast< char *>(&data_ai_SC1Mod8[0]); 

    //Receive data until the client closes the connection 
    do { 
     iResult = recv(client, recvbuf, recvbuflen, 0); 
     if (iResult > 0) { 
      recvbuf[iResult] = (char)0; 
      printf("Received Command: "); 
      printf(recvbuf); 
      printf("\n"); 

      if (recvbuf[4] == 'V') { 
       if (recvbuf[6] == '6') { 
        iSendResult = send(client, "SCXI>", 5, 0); 
        iSendResult = send(client, p_m6, 64, 0); 
        iSendResult = send(client, "<SCXI", 5, 0); 
       } 
       else if (recvbuf[6] == '7') { 
        iSendResult = send(client, "SCXI>", 5, 0); 
        iSendResult = send(client, p_m7, 64, 0); 
        iSendResult = send(client, "<SCXI", 5, 0); 
       } 
       else if (recvbuf[6] == '8') { 
        iSendResult = send(client, "SCXI>", 5, 0); 
        iSendResult = send(client, p_m8, 64, 0); 
        iSendResult = send(client, "<SCXI", 5, 0); 
       } 
       else { 
        iSendResult = send(client, "SCXI>Unrecognized Module<SCXI", 29, 0); 
       } 
      } 
      else { 
       iSendResult = send(client, "SCXI>Unrecognized Command<SCXI", 30, 0); 
      } 
      if (iSendResult == SOCKET_ERROR) { 
       printf("Send failed"); 
       closesocket(client); 
       WSACleanup(); 
       return 1; 
      } 
     } 
     else { 
      closesocket(client); 
      WSACleanup(); 
      return 1; 
     } 
    } while (iResult > 0); 

    closesocket(client); 
    WSACleanup(); 
    return 0; 
} 

Antwort

1

Sie beginnt weigern Verbindungen nach den ersten Verbindungs ​​Thread beendet, weil Sie falsch sind WSACleanup() im Thread aufrufen. Entfernen Sie es. Sie sollten es auch aus der Annahmeschleife entfernen. Sie sollten es nur aufrufen, wenn Sie bereit sind, den gesamten Prozess zu beenden.

Hinweis: Sie testen den falschen Socket in der Annahmeschleife.

Hinweis 2 Ihr Code macht die unhaltbare Annahme, dass jede recv() eine einzige Nachricht empfängt.

+0

Danke! Du bist mein Held. –

Verwandte Themen