Socket spinnt? (recv)



  • Huhu!
    Ich versuche gerade ein typisches Client/Server modell aufzubauen. Ich habe einen Server der auf Nachrichten wartet und einen Client der dem Server nachrichten schicken kann. Der Server empfängt und verarbeitet die Nachrichten korrekt, jedoch hängt sich der Server in einer endlosschleife auf, sobald der Client die Verbindung verliert.

    Ich habe send und recv in eine Klasse gekapselt, die auch wirklich die Bytes empfangen, die empfangen werden sollen. (Nötig wegen Nagle Algorithmus)
    Hier das Stück code:

    void Unisocket::RecvAll(char *buf, const int size)
    {
    	int bytesRecv = 0; //Anzahl Bytes die bereits vom Buffer empfangen wurden.
    	do
    	{
    		int result = recv((int)Socket, buf + bytesRecv, size - bytesRecv, 0);
    
    		if(result < 0) // Wenn send einen Wert < 0 zurückgibt, deutet dies auf einen Fehler hin.
    		{
    			throw CreateSocketError();
    		}
    		bytesRecv += result;
    	}
    	while(bytesRecv < size);
    }
    

    Ich ging davon aus, dass recv den Wert -1 (also SOCKET_ERROR) zurück gibt, wenn die Verbindung abbricht. recv liefert allerdings jedesmal 0 zurück, woraus die endlosschleife resultiert.
    Wenn ich mit send 0 bytes senden will, erhalte ich SOCKET_ERROR, jedoch nicht bei recv. Ist das normal? Muss ich nach jedem recv ein send mit 0 bytes machen um zu schauen ob die Verbindung abgebrochen ist, oder geht es auch eleganter?

    Mfg Perner



  • Hi, die msdn schreibt dazu:

    If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling



  • Alles klar thx. 🙂
    Das heißt also, ich darf jedesmal wenn recv den Wert 0 zurück gibt einen 0 Byte send machen? Oder ist das unsauber?



  • Ich mach's jedenfalls so. Wer was besseres weiß bitte melden 😉



  • Interessant wäre mal zu wissen, ob ein send mit 0 byte überhaupt losgeschickt wird. Wenn nicht, dann kann man genau sagen, dass wenn recv den Wert 0 zurückliefert, die Verbindung getrennt wurde.

    Habe leider heute keine Zeit mehr, dass zu testen. Morgen probier ichs mal aus und berichte. 😉


Anmelden zum Antworten