einen mit beginthread begonnen thread schließen



  • ich hab die abfrage jetzt einfach über den ganzen connectteil gemacht.

    Noch ne andere Frage:
    Wenn der Client beendet wird, welchen wert hat dann Socket_error damit ich abfragen kann ob es ein fehler war oder ob der client beendet wurde?



  • psuh



  • Das einfachste ist immer noch in die Doku zu schauen...
    z.B. bei "recv":

    If the socket is connection oriented and the remote side has shut down the connection gracefully, and all data has been received, a recv will complete immediately with zero bytes received. If the connection has been reset, a recv will fail with the error WSAECONNRESET.



  • recvBack = recv(s1, (char *)&length, sizeof(length), 0);
    if(recvBack  == WSAECONNRESET) MessageBox(0, "", "", 0);
    

    so funktioniert es jedenfalls nicht. wenn der client geschlossen ist tut sich nix



  • Dann ist die Frage, wie der Client geschlossen wird...
    Aber "recv" kommt schon sofort zurück, oder nicht? Wenn nicht, dann schliess der Client die Verbindung nicht korrekt; stört aber auch nicht, da denn irgendwan der Timeout kommt.



  • server:

    recvBack = recv(s1, (char *)&length, sizeof(length), 0);
    		if(recvBack  == WSAECONNRESET)
    		{
    			MessageBox(0, "Client has been closed!", szAppName, 0); 
    			SendMessage(FindWindow(0, "progname"), WM_COMMAND, IDCANCEL, 0); 
    		}
    

    client:

    case WM_DESTROY:
    		  closesocket(s);
    		  WSACleanup();
              PostQuitMessage (0) ;
              return 0 ;
    


  • markusxxx schrieb:

    recvBack = recv(s1, (char *)&length, sizeof(length), 0);
    		if(recvBack  == WSAECONNRESET)
    

    Ähh... Du hast aber schon die Doku zu "recv" gelesen, oder???

    Falls nicht, dann hol das mal schleunigst nach!



  • recvBack = recv(s1, (char *)&length, sizeof(length), 0);
    		if(recvBack == SOCKET_ERROR && GetLastError() == WSAECONNRESET)
    		{
    			MessageBox(0, "Client has been closed!", szAppName, 0); 
    			SendMessage(FindWindow(0, "progname"), WM_COMMAND, IDCANCEL, 0); 
    		}
    

    funktioniert nicht 😞



  • MSDN schrieb:

    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 WSAGetLastError.



  • hm jeder sagt was anderes. Soll ich jetzt 0 oder den Error code von Jochen abfragen?



  • heul langsam nervts nichts klappt -.-

    recvBack = recv(s1, (char *)&length, sizeof(length), 0);
    		if(recvBack == 0)
    		{
    			MessageBox(0, "Client has been closed!", szAppName, 0); 
    			SendMessage(FindWindow(0, "name"), WM_COMMAND, IDCANCEL, 0); 
    		}
    

    geht natürlich auch nicht. Es scheint so als würde recv die kontrolle nicht mehr zurückgeben



  • hat keiner eine Idee?



  • geht natürlich auch nicht. Es scheint so als würde recv die kontrolle nicht mehr zurückgeben

    Ja, recv ist blockierend. Lies die MSDN.
    Simon



  • du weißt leider nicht mal um was es überhaupt geht



  • markusxxx schrieb:

    hm jeder sagt was anderes. Soll ich jetzt 0 oder den Error code von Jochen abfragen?

    Beides. Wenn recv 0 zurückgibt, dann wurde die Verbindung "normal" geschlossen, bei SOCKET_ERROR ist ein Fehler aufgetreten, den du mit WSAGetLastError ermittelst. edit: Und du bist dir auch sicher, dass closesocket auch aufgerufen wird?

    theta schrieb:

    recv ist blockierend.

    Je nach dem, ob der Socket blockierend ist, oder nicht? Wenn der Socket nicht blockierend ist und keine Daten vorliegen, müsste recv mit SOCKET_ERROR und WSAGetLastError()==WSAEWOULDBLOCK zurückkommen.



  • hier nochma der Code:

    server:
    C/C++ Code:
            recvBack = recv(s1, (char *)&length, sizeof(length), 0);
            if(recvBack  == 0)
            {
                MessageBox(0, "Client has been closed!", szAppName, 0);
                SendMessage(FindWindow(0, "progname"), WM_COMMAND, IDCANCEL, 0);}
    Client
         case WM_DESTROY:
              closesocket(s);
              WSACleanup();
              PostQuitMessage (0) ;
              return 0 ;
    


  • Badestrand schrieb:

    theta schrieb:

    recv ist blockierend.

    Je nach dem, ob der Socket blockierend ist, oder nicht? Wenn der Socket nicht blockierend ist und keine Daten vorliegen, müsste recv mit SOCKET_ERROR und WSAGetLastError()==WSAEWOULDBLOCK zurückkommen.

    Korrekt. Nur habe ich im Thread nirgends was von nicht blockierenden Sockets gesehen. Habe das deshalb angenommen. Ist nicht ok, ich gebs zu.

    Simon



  • markusxxx,
    du musst sämtliche Returnwerte von recv behandeln. Für > 0 ist das kein Problem, dann hast du Daten bekommen.
    0 bedeutet "Gegenstelle hat brav aufgelegt" und
    < 0 bedeutet "Irgendein Problem"

    Wenn du non-blocking Sockets verwendest musst du bei < 0 noch checken ob der Fehlercode den du von WSAGetLastError bekommst WSAEWOULDBLOCK war, denn das wäre ein Fehler der "recoverable" ist. Alles andere kannst du als "non-recoverable" ansehen, und die Verbindung schliessen.



  • hell hab <= und es geht immernoch nicht ich hab die schnauze voll



  • dann kotz doch einfach


Anmelden zum Antworten