golang tcp set timeout
Wenn Sie Golang zum Schreiben von TCP-Netzwerkanwendungen verwenden und das Timeout nicht festgelegt ist, bleibt die Netzwerkverbindung möglicherweise längere Zeit hängen, was sich auf die Leistung und Stabilität des Programms auswirkt. Daher ist es im Golang-TCP-Netzwerkprogrammierungsprozess auch besonders wichtig, das Timeout angemessen festzulegen. In diesem Artikel wird erläutert, wie Sie in Golang ein TCP-Timeout festlegen, um die Zuverlässigkeit und Stabilität des Programms zu verbessern.
1. TCP-Verbindungs-Timeout festlegen
Es gibt zwei Möglichkeiten, das TCP-Verbindungs-Timeout in Golang festzulegen: Verwenden Sie DialTimeout oder Dialer. Unter diesen ist DialTimeout eine vereinfachte Version von Dialer. Die
DialTimeout-Funktion ist wie folgt definiert:
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
Unter diesen gibt der dritte Parameter timeout das Verbindungszeitlimit an. Kommt die Verbindung innerhalb dieser Zeit nicht zustande, wird eine Fehlermeldung zurückgegeben.
Dialer kann das Timeout flexibler festlegen, was wie folgt definiert ist:
type Dialer struct { Timeout time.Duration KeepAlive time.Duration Resolver *Resolver DualStack bool FallbackDelay time.Duration Control func(network, address string, c syscall.RawConn) error }
Die Timeout-Eigenschaft von Dialer ähnelt dem Timeout-Parameter der DialTimeout-Funktion, ist jedoch flexibler und kann das Timeout dynamisch festlegen.
Das Folgende ist ein Beispiel für die Verwendung der DialTimeout-Funktion zum Festlegen des TCP-Verbindungs-Timeouts:
conn, err := net.DialTimeout("tcp", "127.0.0.1:9000", 3*time.Second) if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close()
Im obigen Code gibt der dritte Parameter 3*time.Second der DialTimeout-Funktion den Verbindungs-Timeout-Zeitraum an als 3 Sekunden. Kommt die Verbindung innerhalb dieser Zeit nicht zustande, wird eine Fehlermeldung zurückgegeben.
Wenn Sie Dialer verwenden, um ein TCP-Verbindungs-Timeout zu implementieren, können Sie Folgendes tun:
dialer := &net.Dialer{ Timeout: 3 * time.Second, } conn, err := dialer.Dial("tcp", "127.0.0.1:9000") if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close()
Im obigen Code wird der Dialer-Objekt-Dialer verwendet, um das Verbindung-Timeout auf 3 Sekunden festzulegen, und die TCP-Verbindung wird über den Dialer hergestellt. Wählfunktion. Wenn die Verbindung nicht innerhalb von 3 Sekunden hergestellt wird, wird eine Fehlermeldung zurückgegeben.
2. TCP-Lese- und Schreib-Timeout festlegen
Nach dem Herstellen einer TCP-Verbindung müssen Sie auch ein Lese- und Schreib-Timeout festlegen, um lange Wartezeiten oder langsame Antworten zu vermeiden. Das Net-Paket in Golang stellt die Funktionen SetReadDeadline und SetWriteDeadline für Conn bereit, um Lese- und Schreib-Timeouts festzulegen.
Die SetReadDeadline-Funktion wird verwendet, um das TCP-Lese-Timeout festzulegen. Es ist definiert als:
func (c *TCPConn) SetReadDeadline(t time.Time) error
Der Parameter t dieser Funktion stellt das eingestellte Lese-Timeout dar. Wenn innerhalb dieser Zeit keine Daten empfangen werden, wird eine Fehlermeldung zurückgegeben.
Verwendungsbeispiel:
conn, err := net.DialTimeout("tcp", "127.0.0.1:9000", 3*time.Second) if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close() _, err = conn.Write([]byte("hello")) if err != nil { fmt.Println("failed to write:", err) return } if err = conn.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { fmt.Println("failed to set read deadline:", err) } buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { fmt.Println("failed to read:", err) return } fmt.Println(string(buf[:n]))
Im obigen Code wird das TCP-Lese-Timeout über die Funktion conn.SetReadDeadline auf 3 Sekunden festgelegt. Wenn die Verbindung innerhalb dieser Zeit keine Daten empfängt, wird eine Timeout-Fehlermeldung zurückgegeben.
Die SetWriteDeadline-Funktion wird verwendet, um das TCP-Schreib-Timeout festzulegen. Es ist definiert als:
func (c *TCPConn) SetWriteDeadline(t time.Time) error
Der Parameter t dieser Funktion stellt die eingestellte Schreib-Timeout-Zeit dar. Wenn die Daten nicht innerhalb dieser Zeit gesendet werden, wird eine Fehlermeldung zurückgegeben.
Verwendungsbeispiel:
conn, err := net.DialTimeout("tcp", "127.0.0.1:9000", 3*time.Second) if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close() if err = conn.SetWriteDeadline(time.Now().Add(3 * time.Second)); err != nil { fmt.Println("failed to set write deadline:", err) } _, err = conn.Write([]byte("hello")) if err != nil { fmt.Println("failed to write:", err) return }
Im obigen Code wird das TCP-Schreib-Timeout über die Funktion conn.SetWriteDeadline auf 3 Sekunden eingestellt. Wenn die Verbindung das Senden von Daten nicht innerhalb dieser Zeit beendet, wird eine Timeout-Fehlermeldung zurückgegeben.
3. Referenzlink
Das obige ist der detaillierte Inhalt vonGolang TCP-Set-Timeout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!