Maison >développement back-end >Golang >Comment détecter de manière fiable la fermeture d'une connexion TCP dans le package « net » de Go ?

Comment détecter de manière fiable la fermeture d'une connexion TCP dans le package « net » de Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-19 04:58:16355parcourir

How to Reliably Detect TCP Connection Closure in Go's `net` Package?

Détection de la fermeture de la connexion TCP dans le package Net

Dans les serveurs TCP, il est crucial de déterminer quand les clients ont fermé les connexions. Cet article explore comment détecter efficacement cela dans le package net.

L'approche suggérée dans la question, reposant sur des opérations de lecture ou d'écriture avec vérification des erreurs, n'est pas recommandée. Au lieu de cela, une méthode plus fiable consiste à définir des délais de lecture et à vérifier les conditions d'erreur spécifiques.

Approche recommandée :

L'extrait de code suivant, tiré de la « Meilleure façon pour détecter de manière fiable qu'une connexion TCP est fermée", démontre le approche :

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id)
  c.Close()
  c = nil
} else {
  var zero time.Time
  c.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
}

Explication :

  • SetReadDeadline définit un délai au-delà duquel les opérations de lecture échoueront avec une erreur de délai d'attente.
  • Le &Lt ; l'octet 1 est lu pour tester la connexion. S'il est fermé, une erreur de fin de fichier (EOF) est renvoyée.
  • Si la lecture ne renvoie pas EOF, une nouvelle date limite est définie pour vérifier le délai d'attente dans les opérations suivantes.

Détection du délai d'attente :

Pour la détection du délai d'attente, le code suivant peut être utilisé :

if neterr, ok := err.(net.Error); ok & neterr.Timeout() {
  ...
}

Cela vérifie si l'erreur est une net.Error, qui contient des informations supplémentaires telles que Timeout().

Mises à jour :

Dans Go 1.7 et versions ultérieures, les lectures de zéro octet reviennent immédiatement sans erreur. Par conséquent, il est recommandé de lire au moins un octet.

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