Heim >Backend-Entwicklung >Golang >Wie erkennt man zuverlässig das Schließen einer TCP-Verbindung im „net'-Paket von Go?

Wie erkennt man zuverlässig das Schließen einer TCP-Verbindung im „net'-Paket von Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-19 04:58:16368Durchsuche

How to Reliably Detect TCP Connection Closure in Go's `net` Package?

TCP-Verbindungsschließung im Netzpaket erkennen

Bei TCP-Servern ist es entscheidend, festzustellen, wann Clients Verbindungen geschlossen haben. In diesem Artikel wird untersucht, wie dies im Netzpaket effektiv erkannt werden kann.

Der in der Frage vorgeschlagene Ansatz, der auf Lese- oder Schreibvorgängen mit Fehlerprüfung basiert, wird nicht empfohlen. Stattdessen besteht eine zuverlässigere Methode darin, Lesefristen festzulegen und auf bestimmte Fehlerbedingungen zu prüfen.

Empfohlener Ansatz:

Der folgende Codeausschnitt stammt aus der „Best way um zuverlässig zu erkennen, dass eine TCP-Verbindung geschlossen ist“-Thread, demonstriert das Empfohlene Ansatz:

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id)
  c.Close()
  c = nil
} else {
  var zero time.Time
  c.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
}

Erklärung:

  • SetReadDeadline legt eine Zeit fest, nach der Lesevorgänge mit einem Timeout-Fehler fehlschlagen.
  • Die < Byte 1 wird gelesen, um die Verbindung zu testen. Wenn es geschlossen ist, wird ein EOF-Fehler (End of File) zurückgegeben.
  • Wenn der Lesevorgang kein EOF zurückgibt, wird eine neue Frist festgelegt, um bei nachfolgenden Vorgängen auf Zeitüberschreitungen zu prüfen.

Timeout-Erkennung:

Für die Timeout-Erkennung kann der folgende Code verwendet werden verwendet:

if neterr, ok := err.(net.Error); ok & neterr.Timeout() {
  ...
}

Dies prüft, ob der Fehler ein net.Error ist, der zusätzliche Informationen wie Timeout() enthält.

Updates:

In Go 1.7 und höher werden Null-Byte-Lesevorgänge sofort ohne Fehler zurückgegeben. Daher wird empfohlen, mindestens ein Byte zu lesen.

Das obige ist der detaillierte Inhalt vonWie erkennt man zuverlässig das Schließen einer TCP-Verbindung im „net'-Paket von Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn