Heim >Backend-Entwicklung >Golang >Golang TCP-Set-Timeout

Golang TCP-Set-Timeout

WBOY
WBOYOriginal
2023-05-10 12:41:361446Durchsuche

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

  1. DialTimeout und Dialer

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.

  1. Verwendungsbeispiel

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.

  1. SetReadDeadline

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.

  1. SetWriteDeadline

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

  1. net.Dialer: https://golang.org/pkg/net/#Dialer
  2. net.Conn.SetReadDeadline: https://golang.org/pkg/net/#Conn. SetReadDeadline
  3. net.Conn.SetWriteDeadline: https://golang.org/pkg/net/#Conn.SetWriteDeadline
  4. Golang TCP-Client-Beispiel: https://www.linode.com/docs/guides/developing-udp- and-tcp-clients-and-servers-in-go/#golang-tcp-client-example

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!

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