wie mit einem Server schließen TCP beschäftigen
-
05-07-2019 - |
Frage
Im Moment habe ich einen einfachen TCP Server / Client bekommt. Ich habe es so eingerichtet, dass, wenn ein Client eine Verbindung herstellt es gegabelt gets () und die Verbindung selbst ist in eine Endlosschleife gelegt, so dass die Verbindung offen bleibt. Der Server wird die Information von dem Client empfängt, habe ich einen Scheck, um sicherzustellen, dass die Anzahl der empfangenen Bytes ist> 0. Das bisher gut gearbeitet hat bei der Bestimmung, ob die Client-Verbindung beendet hat. Aber wenn der Server trennt der Client auch heruntergefahren, aber keine errno wird gesetzt. Wie kann ich den Server überprüfen, um sicherzustellen noch verbunden ist?
Lösung
Wenn das andere Ende trennt, wird die Buchse lesbar werden (ein Lese auf Sockel blockiert nicht) und die read()
kehrt 0
. Das ist die übliche Art und Weise Abschaltung erkannt wird (es klingt wie Sie dies auf der Server-Seite bereits tun).
Wenn Sie in einem write()
blockiert sind oder versuchen, auf einem Sockel mit dem anderen Ende geschlossen write
, Ihr Prozess wird ein SIGPIPE
Signal zu empfangen und write
kehrt -1
mit errno
auf EPIPE
gesetzt.
Die Standardaktion für SIGPIPE
ist es, den Prozess zu beenden, wenn Sie also nicht verändert haben, dass, wird Ihr Kunde nur sterben, wenn es versucht, auf einen Server zu schreiben, die weggegangen ist.