Prüfen Sie die Verbindung offen oder geschlossen ?(in C Linux)
In der socket-Programmierung unter Linux brauche ich zum schreiben von Daten in die Buchse, aber ich weiß nicht socket öffnen oder zu schließen . wie ich weiß, dass socket öffnen und schließen, ohne zu Lesen ?
printf("befor read%d\n", n);
bzero(buffer, MAX_SIZE_BUFFER);
n = read(sockfd, buffer, MAX_SIZE_BUFFER - 1);
printf("after read%d\n", n);
if (n <= 0)
{
break;
}
printf("befor write%d, s: %d \n", n , sockfd);
n = write(newsockfd, buffer, n);
if (n <= 0)
{
break;
}
Ich lese aus sockfd, und ich sicher, dass diese Verbindung offen ist . Wann write buffer in newsockfd ich weiß nicht, newsockfd ist öffnen oder schließen, wie Sie überprüfen, newsockfd geschlossen ist ?
Ich weiß, problem . in der Mitte des Schreibens Verbindung geschlossen . zum Beispiel schreiben 1024 Daten in 500-Verbindung geschlossen und das Programm geschlossen. wie um dies zu vermeiden ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Weg, um zu überprüfen, ob Sie schreiben können, um ein socket ist, überraschend, zu versuchen und zu schreiben 🙂
Wenn der socket geschlossen wurde, erhalten Sie eine
-1
return-code vonwrite
und Sie können prüfen, dieerrno
um zu sehen, was das problem war.Wenn der socket ist noch gültig, aber Sie kann einfach nicht schreiben jeglicher Daten auf den moment,
write
0 zurück. Dieread
rufen auch verhält sich in ähnlicher Weise, Rückkehr-1
wenn es ein problem gibt.Grundsätzlich für
write
:-1
sind, gibt es problem, und Sie sollten prüfenerrno
zu sehen, ob es wiederherstellbar ist oder tödlich.0
, dann kann man nicht alles schreiben, was im moment (kann ein Netzwerk-Rückstand oder ein anderes problem aber definitiv (noch) nicht tödlich).Update: Als caf hat darauf hingewiesen, in den Kommentaren, ich vergaß zu berücksichtigen, die Handhabung von Signalen. Sie haben zu ignorieren, die broken pipe-signal oder
write
scheitern wird intern durch die Anhebung, die das signal.Können Sie tun Sie dies, indem Sie:
bevor die socket-Funktionen. Sie können dann nutzen:
zur Wiederherstellung des vorherigen signal handling.
write
0 zurück. Dies kann passieren, wenn ein temporäres Netzwerk-Rückstand. Wenn der Rückstand verwandelt sich in ein echtes problem, die Sitzung wird geschlossen und Sie werden schließlich bekommen -1. Bis dahin, einfach weiter versuchen.write
socket wurde geschlossen, das andere Ende führt in den Prozess zu erhalten, einSIGPIPE
signal die default-Aktion von denen, um den Prozess zu beenden.Ich send() verwenden, anstatt write (), die sich mit kein signal :
sigaction
zu ignorierenSIGPIPE
(set hf zuSIG_IGN
).Socket-Programmierung eher schwierig, weil Sie oft nicht wissen, ist ein Fehler aufgetreten erst viel später.
Zum Beispiel, wenn die Maschine, die Sie zu schreiben sind heruntergefahren ungewöhnlich, das schreiben nennen kann erfolgreich sein ( weil Sie in der Lage waren zu schreiben, um Ihre internen OS-Puffer ), nur um zu scheitern, während die in der Nähe nennen.
Es sei denn, Sie haben eine application-layer-Möglichkeit der überprüfung der socket aktiv ist ( D. H., das senden einer Nachricht und erfordern eine Antwort innerhalb einer bestimmten Zeitspanne ) Sie haben keine Möglichkeit zu wissen. Wenn Sie ein standard-Protokoll, so etwas kann schon vorhanden sein, um Fehler zu behandeln.
Also die kurze Antwort ist, dass Sie brauchen, um zu überprüfen für Fehler gibt von so ziemlich jeder nennen, der berührt die Buchse ( Lesen, schreiben, schließen, etc... ).