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 :
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!