2009-09-29 7 views
0

Après avoir établi une connexion tcp avec un serveur, je ferme mon application linux et Socket.close() est appelée.La connexion tcp dans TIME_WAIT ne permet pas la reconnexion, java

Vérification de netstat -pant, je vois que la connexion est dans l'état TIME_WAIT. Cela m'empêche de rétablir immédiatement la connexion au serveur puisque j'utilise le même port pour me connecter. Au lieu de cela, je dois attendre la connexion au timeout du statut TIME_WAIT avant de pouvoir me reconnecter. J'ai joué - sans trop de chance - avec les méthodes de socket: set_so_timeout(), set_keepalive(), set_so_linger(), et set_reuseaddr() - l'orthographe exacte de la méthode peut ne pas être correcte dans ce post.

Ma question est COMMENT comment puis-je faire sortir la connexion du statut TIME_WAIT pour que je puisse à nouveau établir une connexion instantanément?

Faites-le moi savoir s'il vous plaît.

Merci, JBU

Répondre

5

La meilleure façon d'obtenir la connexion de TIME_WAIT est (étonnamment) attendre :-)

Voilà comment fonctionne le protocole TCP/IP. Une session est identifiée par le tuple (sourceIP, sourcePort, destIP, destPort, protocol) et la raison pour laquelle vous ne pouvez pas le réutiliser est qu'il y a peut-être des paquets dans le réseau quelque part. L'état TIME_WAIT est généralement le double de la durée de vie maximale des paquets et et non car il peut entraîner l'apparition de paquets de la session précédente (ce qui détraque votre session actuelle).

Idéalement, vous devez vous connecter à partir d'un port source différent, vous serez alors en mesure d'ouvrir la session immédiatement.

Une autre chose que vous devriez faire attention est des sessions mal fermées. J'ai toujours souscrit à la directive que le client devrait fermer la session (et l'arrêter proprement). Cela minimise la possibilité de sessions semi-fermées de longue durée.

+0

Oui, le port différent résout le problème et je vais l'utiliser pour l'instant. Cependant, la description de la méthode so_linger semble devoir fonctionner si je veux utiliser le même port source. Je ne suis pas sûr de savoir pourquoi. – jbu

+1

SO_LINGER n'est définitivement pas recommandé. Son support est, au mieux, sporadique sur des plates-formes non-BSD. – paxdiablo

+0

Je ne pense pas que l'utilisation d'une autre chaîne de connexion est une solution élégante, il devrait y avoir un moyen de forcer le TCP/IP à vider tout le contenu du socket et à fermer la connexion. –

Questions connexes