einen mit beginthread begonnen thread schließen
-
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.
-
danke, mittlerweile hat es doch geklappt, ka an was es lag.
Hätte aber noch ein anderes Anliegen.
Wenn Server und Client verbunden sind und dann der Client geschlossen wird,
kann ich dass dann irgendwie machen, dass ich den Server nicht neu starten muss sondern nur nochmal auf Start server klicken kann?
Muss ich dann einfach nochmal genauso wie zuvor die sockets neu connecten?
könnte ich einfach ein goto anfang; machen und es klappt dann wieder?
(das goto ist nur theretisch ich benutze es natürlich nicht)