2017-07-07 1 views
2

Oder wie zu überprüfen, ist es für Read oder Write in Schleife? Wenn das Conn geschlossen oder nicht verfügbar ist, sollten wir die Schleife stoppen.Wie überprüft man ein net.Conn ist geschlossen?

Zum Beispiel:

package main 

import "net" 

func main() { 
    conn, err := net.Dial("tcp", "127.0.0.1:1111") 
    defer conn.Close() 
    for { 
     buf := make([]byte, 1, 1) 
     n, err := conn.Read(buf) 
     if err != nil { 
      // currently we can only stop the loop 
      // when occur any errors 
      log.Fatal(err) 
     } 
    } 
} 

Antwort

1

Sie eine Reihe von Fehlern bekommen, je nachdem, wie die Verbindung geschlossen wurde. Der einzige Fehler, auf den Sie beim Empfang von Read zählen können, ist ein io.EOF. io.EOF ist der Wert, der angibt, dass eine Verbindung normal geschlossen wurde.

Andere Fehler können mit der net.Error Schnittstelle für ihre Timeout und Temporary Methoden überprüft werden. Diese sind normalerweise vom Typ net.OpError. Jeder nicht temporäre Fehler, der von einem Write zurückgegeben wird, ist fatal, da dies anzeigt, dass der Schreibvorgang nicht erfolgreich war. Beachten Sie jedoch, dass aufgrund der zugrunde liegenden Netzwerk-API Schreibvorgänge, die keinen Fehler zurückgeben, nicht garantiert sind.

Im Allgemeinen können Sie einfach die io.Reader API folgen.

Wenn Lesen nach dem erfolgreichen Lesen von n> 0 Bytes auf einen Fehler oder eine Dateiende-Bedingung stößt, wird die Anzahl der gelesenen Bytes zurückgegeben. Es kann den (Nicht-Null-) Fehler von demselben Aufruf zurückgeben oder den Fehler (und n == 0) von einem nachfolgenden Aufruf zurückgeben. Eine Instanz dieses allgemeinen Falls ist, dass ein Leser, der eine von Null verschiedene Anzahl von Bytes am Ende des Eingabestroms zurückgibt, entweder err == EOF oder err == nil zurückgibt. Der nächste Lesevorgang sollte 0, EOF zurückgeben.

Wenn Daten gelesen wurden, behandeln Sie das zuerst. Nachdem Sie mit den Daten fertig sind, können Sie bei einem Fehler aus der Schleife ausbrechen. Wenn es io.EOF war, wird die Verbindung normal geschlossen, und alle anderen Fehler können Sie behandeln, wie Sie für richtig halten.

+1

Beachten Sie, dass dies nur Lesevorgänge umfasst. Schriftsätze sollten nicht 'io.EOF' zurückgeben. – Adrian

Verwandte Themen