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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2023-05-10 12:41:36
original
1610 Les gens l'ont consulté

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)
Copier après la connexion

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
}
Copier après la connexion

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()
Copier après la connexion

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()
Copier après la connexion

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
Copier après la connexion

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]))
Copier après la connexion

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
Copier après la connexion

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
}
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal