Timeout für recv

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Metatron

Grünschnabel
Hallo,

ich habe eine Client Server Anwendung.
Falls der Server mal nicht antwortet brauche ich ein Timeout um den Befehl nochmals zusenden.
ich versuche es derzeit mit folgenden:

setsockopt(m_s, SOL_SOCKET, SO_RCVTIMEO, (char *)& timeout, sizeof(int));
*size = recv(m_s, buf, *size, 0);

dies funktioniert auch sehr gut.
Ich müsste nur irgendwie rauskriegen nach dem recv ob ein timeout ausgelöst wurden ist, um die Daten die im buf drin stehen zu ignorieren.
Hat jemand eine idee?
Windows 10, Visual Studio
 

Technipion

Erfahrenes Mitglied
Ich müsste nur irgendwie rauskriegen nach dem recv ob ein timeout ausgelöst wurden ist, um die Daten die im buf drin stehen zu ignorieren.
Du bekommst dann doch einen Fehlerwert zurück?

recv function (winsock.h) - Win32 apps

Du musst dir halt den Fehlerwert über WSAGetLastError() holen.

Wie im Beispiel auf der oben verlinkten Seite:
C++:
    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );

Gruß Technipion
 

Metatron

Grünschnabel
Hallo danke für die Antwort.
Ich hatte dies bereits versucht. Bei der Abfrage:
Code:
        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());
Habe ich das Problem, wenn der Timeout kommt, das iResult = = 4294967295 ist und in recvbuf = "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..." drin steht.

ich habe auch bereits versucht:
Code:
     if ( iResult > 0 )
        {
               if (WSAGetLastError() != WSAETIMEDOUT)
               {
                         timeout
               }
        }
aber auch dies funktioniert nicht
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…