104 votes

Comment supprimer une connexion de socket CLOSE_WAIT ?

J'ai écrit un petit programme qui interagit avec un serveur sur un port spécifique. Le programme fonctionne bien, mais :

Une fois que le programme s'est terminé de manière inattendue, et depuis cette connexion de socket est affichée en CLOSE_WAIT l'état. Si j'essaie d'exécuter un programme, il se bloque et je dois le forcer à se fermer, ce qui accumule encore plus de travail. plus CLOSE_WAIT les connexions de douilles.

Y a-t-il un moyen de rincer ces connexions ?

3voto

Binita Bharati Points 393

Il convient de mentionner que le Socket à la fois du côté client et du côté serveur doit invoquer explicitement close() . Si une seule des extrémités invoque close() dans ce cas également, la socket restera dans l'état CLOSE_WAIT.

1voto

Zeksie Points 140

Il convient également de noter que si votre programme génère un nouveau processus, ce dernier peut hériter de tous vos handles ouverts. Même après la fermeture de votre propre programme, ces handles hérités peuvent toujours être en vie via le processus enfant orphelin. Et ils n'apparaissent pas nécessairement de la même manière dans netstat. Mais tout de même, la socket restera en CLOSE_WAIT tant que ce processus enfant sera en vie.

J'ai eu un cas où j'exécutais ADB. ADB lui-même crée un processus serveur s'il n'est pas déjà en cours d'exécution. Celui-ci a hérité de tous mes handles au départ, mais n'est apparu comme propriétaire d'aucun d'entre eux lorsque j'ai enquêté (la même chose était vraie pour macOS et Windows - pas sûr pour Linux).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X