Verbindung trennen / Winsocks
-
SOCKET *s = DSocket;Was ist DSocket für ein Socket?
Du legst einen Pointer auf diesen Socket an und immer wenn du diesen Pointer benutzt greifst du also direkt auf diesen Socket zu.Ob du nun
connected_socket = accept( *s, NULL, NULL ); *s = connected_socket;schreibst oder
*s = accept( *s, NULL, NULL );ist im Endeffekt egal.
Ich denke das Problem liegt darin, dass du DSocket überschreibst und deshalb darauf beim zweiten Mal nicht zugegriffen werden kann.
Das ist aber nur eine Vermutung, da ich nicht genau weiß was DSocket überhaupt für ein Socket ist.
-
Es geht jetzt, ich habe die ServerSocket funktion ein bisschen umprogrammiert, so das in der Funktion ein neues Socket erstellt wird, das dann auf dem Port lauscht. Sobald eine verbindung mit accept angenommen wird, wird das zurückgegeben Socket dem richtig Socket zugewiesen (das mit dem das Programm arbeitetet), dann wird das listen socket noch in der Server Socket Funktion wieder geschlossen.
thks
-
Habe derzeit genau das selbe Problem.
while(!TerminateNetworkThread) { AcceptSocket = SOCKET_ERROR; while ( AcceptSocket == SOCKET_ERROR ) AcceptSocket = accept(s, NULL, NULL ); do { bytesRecv = recv(AcceptSocket, recvbuf, 32, 0 ); if(bytesRecv > 2) MessageBox(NULL, recvbuf, "data", MB_OK | MB_ICONINFORMATION ); else if(bytesRecv == SOCKET_ERROR) MessageBox(NULL, "Connection lost.", "Info", MB_OK | MB_ICONINFORMATION ); } while(bytesRecv != SOCKET_ERROR); shutdown(AcceptSocket, SD_BOTH); closesocket(AcceptSocket); }Nachdem der Client die Verbindung getrennt hat, kann er sich noch einmal erfolgreich mit dem Server verbinden und Daten übertragen. Sobald die Verbindung aber wieder (d.h. zum zweiten Mal) getrennt wird, ist es nicht mehr möglich sich erneut mit dem Server zu verbinden, dieser kommt aus dem recv() nicht mehr zurück und produziert 100% Prozessorauslastung.
-
Problem gelöst. recv() liefert 0 zurück wenn die Verbindung korrekt getrennt wurde, das wurde nicht abgeprüft.