TCP keep-alive afin de déterminer si le client déconnecté dans netty
Je suis en train de déterminer si un client a fermé une connexion de socket de netty. Est-il un moyen de faire cela?
OriginalL'auteur Josh Wilson | 2014-01-26
Vous devez vous connecter pour publier un commentaire.
Sur un cas habituel où un client ferme la socket via
close()
et le TCP fermeture poignée de main a été terminé avec succès, unechannelInactive()
(ouchannelClosed()
3) l'événement sera déclenché.Cependant, sur un cas inhabituel comme lorsqu'un ordinateur client se déconnecte en raison de panne de courant ou débranché le câble LAN, il peut prendre beaucoup de temps jusqu'à ce que vous découvrez que la connexion a été fait vers le bas. Pour détecter cette situation, vous devez envoyer un message au client périodiquement et s'attendre à recevoir sa réponse dans un certain laps de temps. C'est comme une table de ping - vous devez définir un périodique ping et pong message dans votre protocole de pratiquement rien, mais de vérifier l'état de la connexion.
Alternativement, vous pouvez activer
SO_KEEPALIVE
, mais le keepalive intervalle de cette option est généralement dépendants et je ne recommande pas de l'utiliser.Pour aider un utilisateur à mettre en œuvre ce genre de comportement relativement facilement, Netty fournit
ReadTimeoutHandler
. Configurer votre pipeline de sorte queReadTimeoutHandler
soulève une exception quand il n'y a pas de trafic entrant pour un certain laps de temps, et de fermer la connexion à l'exception de votreexceptionCaught()
méthode de gestionnaire. Si vous êtes la partie qui est censé envoyer périodiquement un message ping, utiliser un timer (ouIdleStateHandler
) pour l'envoyer.OriginalL'auteur trustin
Si vous écrivez un serveur, et netty est votre client, votre serveur peut détecter une déconnexion en appelant
select()
ou équivalent pour détecter si le socket est lisible et ensuite appelerrecv()
. Sirecv()
retourne 0 alors le socket a été fermé correctement par le client. Sirecv()
retourne -1, puis vérifiererrno
ou l'équivalent pour l'erreur réelle (à quelques exceptions près, la plupart des erreurs doit être traité comme un maladroit déconnecter). La chose à propos de l'inattendu se déconnecte, c'est qu'ils peuvent prendre beaucoup de temps pour l'OS, afin de détecter, de sorte que vous auriez à activer le protocole TCP keep-alives, ou d'obliger le client à envoyer des données au serveur sur une base régulière. Si rien n'est reçu par le client pour une période de temps, puis il suffit de supposer que le client est parti et la fermeture de votre fin de la connexion. Si le client le souhaite, il peut, puis rebranchez-le.OriginalL'auteur Remy Lebeau
Si vous lisez à partir d'une connexion qui a été fermé par les pairs, vous obtiendrez une fin-de-flux indication d'un certain type, en fonction de l'API. Si vous écrivez à ce qu'une telle connexion, vous obtiendrez une IOException: connection reset". TCP n'est pas de fournir tout autre moyen de détecter une connexion fermée.
TCP keep-alive (un) est désactivée par défaut et (b) ne fonctionne toutes les deux heures, par défaut lorsqu'il est activé. Ce n'est probablement pas ce que vous voulez. Si vous l'utilisez et que vous lisez ou écrivez après qu'il a détecté que la connexion est interrompue, vous obtiendrez la réinitialisation d'erreur ci-dessus,
WSAIoctl(SIO_KEEPALIVE_VALS)
.OriginalL'auteur user207421
Cela dépend de votre protocole que vous utilisez ontop de netty. Si vous le créez à l'appui de ping-comme des messages, il vous suffit d'envoyer ces messages. En outre, netty est seulement un assez mince wrapper autour de TCP.
Voir aussi cette SORTE de post qui décrit
isOpen()
et connexes. Ceci, cependant, ne résout pas le keep-alive problème.Avez-vous un lien? Si vous pourriez suggérer une modification, je serai heureux de l'accepter!
Ma compréhension est que le protocole tcp a keep-alive construit en. Il n'est pas possible de tirer parti de cela?
Oui, il est. TCP keep-alive est désactivé par défaut, il vous suffit de l'allumer après établissement de la connexion.
Je vous suggère de lien vers cette réponse.
OriginalL'auteur Uli Köhler