Programm hängt sich auf



  • Hallo,

    ich hab mal wieder ein kleines Problem.

    Ich habe eine TCPServer-Klasse implementiert, die beim connecten eines Clients die OnClientConnect Methode im extra Thread aufruft.

    Die OnClientConnect Methode sieht wie folgt aus:

    void TelemetryReceiver::OnClientConnect(int clientID)
    {
    	printf("ClientID%i\n",clientID);
    	// Client in map speichern
    	UDPClientList[clientID] = UDPClient();
            printf("Nacher");
    
    }
    

    Header:

    std::map<int, UDPClient> UDPClientList;
    

    Sobald ich UDPClientList... auskommentiere funktioniert alles wunderbar. Wenn ich diese Funktion ohne Thread ausführe klappt es auch. Komischerweise, gibt er "Nacher" auch noch aus.

    Hier wird die Funktion aufgerufen:

    void TCPServer::ReceiveClient(int clientSocket)
    {
    	printf("Empfangen");
    	_onClientConnectFunction(clientSocket, _cRDFParams);
    
    	// Solange kein Abbruchbefehl kommt, Daten empfangen
    	int dataLength;
    	const int bufferLength = 256;
    	BYTE *buffer = new BYTE[bufferLength];
    	while(_listening)
    	{
    		// Daten empfangen, währenddessen blockieren
    		dataLength = recv(clientSocket, buffer, bufferLength, 0);
    		printf("Daten empfangen!");
    		// Ist ein Fehler aufgetreten?
    		if(dataLength == -1)
    		{
    			// Fehlermeldung ausgeben
    			perror ("Fehler");
    
    			// Nicht gut
    			throw THOMASException("Fehler beim Empfangen von Client-Daten!");
    		}
    
    		// Ist die Verbindung abgebrochen?
    		if(dataLength == 0)
    		{
    			// Empfangsfunktion abbrechen
    			break;
    		}
    
    		// Daten verarbeiten
    		_computeReceivedDataFunction(buffer, dataLength, _cRDFParams, clientSocket);
    	}
    
    	// Client-Socket schließen
    	close(clientSocket);
    }
    

    Liegt dies am seperaten Thread, und wenn ja, wie kann ich das Problem lösen?

    Edit:// Scheinbar funktioniert es, allerdings gibt er die Nachrichten mit printf nicht aus. Erst, wenn sich ein neuer Client verbindet.
    Es landet also im Buffer. Gibts ne möglichkeit diese Nachricht trotzdem auszugeben?



  • fflush(stdio);



  • Mal so nebenbei: Du hast zum einen buffer nicht geloescht und zum anderen kann es passieren, dass du mit throw rausspringst und dadurch das delete ueberspringst. Benutze std::vector oder in seltenen Faellen auch unique_ptr<BYTE[]>.



  • manni66 schrieb:

    fflush(stdio);

    Es war
    fflush(stdout);
    gemeint.



  • Also die 256 buffer Bytes würde ich mir einfach vom Stack nehmen.


Log in to reply