Überwachen des TCP-Verbindungsstatus im Netzpaket
Eine häufige Aufgabe bei TCP-Serverimplementierungen besteht darin, festzustellen, wann eine Clientverbindung geschlossen wurde. Diese Frage untersucht eine zuverlässige Methode zum Erkennen von Verbindungsabschlüssen im Go-Net-Paket.
Überprüfung auf geschlossene Verbindungen
Der empfohlene Ansatz besteht darin, sowohl einen Lese- als auch einen Schreibvorgang zu versuchen und prüfen Sie, ob einer der beiden einen Nullfehler zurückgibt. Wenn beide Vorgänge erfolgreich sind, wird davon ausgegangen, dass die Verbindung geöffnet ist. Allerdings weist diese Methode Einschränkungen auf.
Zuverlässige Erkennung mithilfe von Zeitüberschreitungen
Eine zuverlässigere Lösung besteht darin, eine Lesefrist festzulegen und einen Ein-Byte-Leseversuch zu unternehmen. Wenn der Lesevorgang mit einem io.EOF-Fehler abgeschlossen wird, gilt die Verbindung als geschlossen. Um Fehlalarme aufgrund langsamer Clients zu verhindern, kann eine Lesefrist ungleich Null festgelegt werden.
one := make([]byte, 1) c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { // Connection closed }
Timeout-Erkennung
Wenn die Lesezeitüberschreitung abläuft, wird die angegebene Frist angezeigt error implementiert die Schnittstelle net.Error und die Timeout()-Methode des Fehlers kann zur Überprüfung verwendet werden Ursache.
if neterr, ok := err.(net.Error); ok && neterr.Timeout() { // Connection timed out }
Überlegungen zu Go 1.7
In Go 1.7 werden Null-Byte-Lesevorgänge sofort ohne Fehler zurückgegeben. Daher ist es wichtig sicherzustellen, dass mindestens ein Byte gelesen wird, um Fehlalarme zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie kann ich geschlossene TCP-Verbindungen im „net'-Paket von Go zuverlässig erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!