Maison >développement back-end >Golang >Golang TCP définit le délai d'attente

Golang TCP définit le délai d'attente

WBOY
WBOYoriginal
2023-05-10 12:41:361446parcourir

golang tcp set timeout

Lors de l'utilisation de golang pour écrire des applications réseau TCP, si le délai d'attente n'est pas défini, la connexion réseau peut être bloquée pendant une longue période, ce qui affectera les performances et la stabilité du programme. Par conséquent, dans le processus de programmation du réseau Golang TCP, il est également particulièrement important de définir le délai d'attente de manière raisonnable. Cet article explique comment définir le délai d'expiration TCP dans Golang pour améliorer la fiabilité et la stabilité du programme.

1. Définir le délai d'expiration de la connexion TCP

  1. DialTimeout et Dialer

Il existe deux façons de définir le délai d'expiration de la connexion TCP dans Golang : utilisez DialTimeout ou utilisez Dialer. Parmi eux, DialTimeout est une version simplifiée de Dialer. La fonction

DialTimeout est définie comme suit :

func DialTimeout(network, address string, timeout time.Duration) (Conn, error)

Parmi eux, le troisième paramètre timeout spécifie le délai d'expiration de la connexion. Si la connexion n'est pas établie dans ce délai, un message d'erreur sera renvoyé.

Dialer peut définir le délai d'expiration de manière plus flexible, qui est défini comme suit :

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
}

La propriété Timeout de Dialer est similaire au paramètre timeout de la fonction DialTimeout, mais est plus flexible et peut définir le délai d'expiration de manière dynamique.

  1. Exemple d'utilisation

Ce qui suit est un exemple d'utilisation de la fonction DialTimeout pour définir le délai d'expiration de la connexion TCP :

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()

Dans le code ci-dessus, le troisième paramètre 3*time.Le deuxième de la fonction DialTimeout spécifie le délai d'expiration de la connexion comme 3 secondes. Si la connexion n'est pas établie dans ce délai, un message d'erreur sera renvoyé.

Si vous utilisez Dialer pour implémenter le délai d'expiration de la connexion TCP, vous pouvez faire ceci :

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()

Dans le code ci-dessus, le numéroteur d'objet Dialer est utilisé pour définir le délai d'expiration de la connexion à 3 secondes et la connexion TCP est établie via le numéroteur. Fonction de numérotation. Si la connexion n'est pas établie dans les 3 secondes, un message d'erreur sera renvoyé.

2. Définir le délai d'expiration de lecture et d'écriture TCP

Après avoir établi une connexion TCP, vous devez également définir un délai d'expiration de lecture et d'écriture pour éviter de longues attentes ou des réponses lentes. Le package net de golang fournit les fonctions SetReadDeadline et SetWriteDeadline permettant à Conn de définir les délais d'attente de lecture et d'écriture.

  1. SetReadDeadline

La fonction SetReadDeadline est utilisée pour définir le délai d'expiration de lecture TCP. Il est défini comme :

func (c *TCPConn) SetReadDeadline(t time.Time) error

Le paramètre t de cette fonction représente le délai d'attente de lecture défini. Si aucune donnée n'est reçue dans ce délai, un message d'erreur sera renvoyé.

Exemple d'utilisation :

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]))

Dans le code ci-dessus, le délai d'expiration de lecture TCP est défini sur 3 secondes via la fonction conn.SetReadDeadline. Si la connexion ne reçoit pas de données dans ce délai, un message d'erreur de délai d'attente sera renvoyé.

  1. SetWriteDeadline

La fonction SetWriteDeadline est utilisée pour définir le délai d'expiration d'écriture TCP. Il est défini comme :

func (c *TCPConn) SetWriteDeadline(t time.Time) error

Le paramètre t de cette fonction représente le délai d'expiration d'écriture défini. Si les données ne sont pas envoyées dans ce délai, un message d'erreur sera renvoyé.

Exemple d'utilisation :

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
}

Dans le code ci-dessus, le délai d'expiration d'écriture TCP est défini sur 3 secondes via la fonction conn.SetWriteDeadline. Si la connexion ne termine pas l'envoi de données dans ce délai, un message d'erreur de délai d'attente sera renvoyé.

3. Lien de référence

  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. Exemple de client TCP Golang : https://www.linode.com/docs/guides/developing-udp- et-tcp-clients-and-servers-in-go/#golang-tcp-client-example

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:demande de fusion golangArticle suivant:demande de fusion golang