Surveillance de l'état de la connexion TCP dans le package Net
Une tâche courante dans les implémentations de serveur TCP consiste à déterminer quand une connexion client a été fermée. Cette question explore une méthode fiable pour détecter les fermetures de connexion dans le package Go net.
Vérification des connexions fermées
L'approche suggérée consiste à tenter à la fois une opération de lecture et d'écriture. et vérifiez si l’un ou l’autre renvoie une erreur nulle. Si les deux opérations réussissent, la connexion est supposée ouverte. Cependant, cette méthode présente des limites.
Détection fiable à l'aide de délais d'attente
Une solution plus fiable consiste à définir une date limite de lecture et à tenter une lecture d'un octet. Si la lecture se termine par une erreur io.EOF, la connexion est considérée comme fermée. Pour éviter les faux positifs dus à des clients lents, un délai de lecture différent de zéro peut être défini.
one := make([]byte, 1) c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { // Connection closed }
Détection du délai d'attente
Si le délai d'expiration de lecture expire, le L'erreur implémentera l'interface net.Error et la méthode Timeout() de l'erreur peut être utilisée pour vérifier le cause.
if neterr, ok := err.(net.Error); ok && neterr.Timeout() { // Connection timed out }
Considérations sur Go 1.7
Dans Go 1.7, les lectures de zéro octet reviennent immédiatement sans erreur. Par conséquent, il est crucial de s'assurer qu'au moins un octet est lu pour éviter les faux positifs.
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!