einen mit beginthread begonnen thread schließen
-
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
-
Poste doch mal minimalen Code, den wir mal durchkompilieren und ausprobieren können.