Wie finden Sie heraus, wenn ein socket geschlossen ist
Habe ich ein kleines client-server Programm, das ich gemacht, aber das Hauptproblem ist, dass sobald eine Verbindung hergestellt ist zwischen dem client und dem server, wenn der client schließt sich das Programm, den server wiederholt ausgeführt, die Letzte Nachricht, und das schafft große Probleme, manchmal. Also was ich möchte ist, wenn es irgendeine Funktion, die ich anrufen kann um den Status eines SOCKET-Struktur, so dass, wenn der client schließt das Programm, der server weiß, zu stoppen. Ich brauche nur die Funktion was zu suchen von der Funktion für eine schlechte Steckdose. Übrigens Schreibe ich dieses Programm in Win32 c. Ich habe versucht if(mySocket==SOCKET_ERROR), die nicht zu funktionieren scheinen... es sei denn, ich habe es falsch ist. Ich bin erst am Anfang der Vernetzung.
if(!sockServer.RecvData( recMessage, STRLEN )){return 0;}
//where
bool Socket::RecvData( char *buffer, int size )
{
int i = recv( mySocket, buffer, size, 0 );
if(!i){return false;}
buffer[i] = '\0';
return true;
} //this isn't working
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die peer-schließt den socket,
read()
undrecv()
wird null zurückgeben. Müssen Sie ignorieren, dass wenn "der server wird wiederholt ausgeführt, die Letzte Nachricht', die natürlich 'große Probleme' nicht nur 'manchmal' aber immer.EDIT 1: Sie sind auch die anderen Elementare TCP-Programmierung Fehler: Sie gehen davon aus, dass erhalten Sie eine komplette Nachricht in eine einzelne lese. Es gibt keine Nachrichten in TCP, es ist nur ein byte-stream, und nicht 1::1-Korrespondenz zwischen schreib-und Lesevorgänge (
send()
undrecv()
).recv()
zurückgeben kann null oder so wenig wie 1 Byte. Sie organisieren Ihre eigenen Nachricht an Grenzen, und Sie haben zu Durchlaufen, bis Sie erhalten eine gesamte Nachricht, die Sie behandeln können.EDIT 2: Sie auch ignorieren Sie alle Fehler in Ihrer Methode erhalten. Muss man sich für
recv()
Rückgabe -1`, und gehen nicht mit der Logik, die die Daten verarbeitet, für die Sie versuchen zu Lesen. An einem minimum sollten Sie rufen Sie perror() oder check errno oder was auch immer das Winsock-äquivalent ist.Wenn man entweder ein Fehler oder eine EOS-Sie müssen anhalten und das Abspielen in Schleife, schließen Sie die Steckdose, vergessen Sie die Verbindung, und vergessen, diese client.
false
undzero
bzw; verlassen was auch immer Schleife treibt diese Logik, in der Nähe der Buchse; und tun, was andere Zimmerreinigung ist erforderlich, um zu vergessen, über diese sockel, diese client-Verbindung.Wie über das Zuhören für FD_CLOSE in Ihre Wichtigste Botschaft proc? Sie sind mit WSAAsyncSelect mit FD_CLOSE Recht?
FD_CLOSE
würde nicht Fragen, wie die server-Seite-socket ist nichtclose()
d automatisch, wenn der client beendet.