web-dev-qa-db-fra.com

Comment le système d'exploitation indique-t-il si une "adresse est déjà utilisée"?

Si mon programme C utilise des sockets, lie à localhost:9025, échange certaines données, est tuée manuellement et redémarré, elle se bloque parfois avec l'erreur:

Adresse déjà utilisée.

Tous les logiciels recommandés au SE que j'ai essayé de rechercher "PID qui utilise le port" n'ont pas réussi à renvoyer un identifiant de processus, alors je suppose qu'il n'y a pas de processus à ce moment-là qui utilise le port 9025, qui devrait être le cas.

Néanmoins, de ce que j'ai rassemblé des commentaires sur des questions similaires, il me semblait que "l'adresse" est "déjà utilisée" si et uniquement si un processus utilise cette adresse particulière. Pourquoi est-ce faux alors?

Maintenant, je suppose que le système d'exploitation garde une trace de quelles adresses sont utilisées et que ne sont pas, mais c'est que le cas? Si c'est cependant, j'aimerais que si vous pouviez me dire comment puis-je le corriger, car ma meilleure solution à ce problème est "attendre une quantité de temps indéterminée".

Edit: J'utilise Linux 5.2.2-Arch1- Arch X86_64

13
Captain Trojan

Vous redémarrez probablement votre programme trop rapidement, sinon le programme ne ferme pas la prise.

Même après la fermeture du socket, Linux conserve la connexion dans les limbes pendant un certain temps, mais empêchera toute autre connexion d'être acceptée pour le même quadruplé de "adresse source, port source, adresse de destination, port de destination".

La solution consiste à définir l'option Socket dans le programme avec setSockOpt comme ceci:

setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )
32
harrymc