Comment fermer un socket laissée ouverte par un tué programme?
J'ai une application en Python qui s'ouvre d'un simple socket TCP pour communiquer avec une autre application en Python sur un autre ordinateur. Parfois, le programme sera soit une erreur ou je vais directement à la tuer, et dans les deux cas, la prise peut être laissée ouverte pour quelques temps inconnu.
La prochaine fois que je vais à exécuter le programme, j'obtiens cette erreur:
socket.error: [Errno 98] Address already in use
Maintenant, le programme essaie toujours d'utiliser le même port, il semble comme si elle est toujours ouverte. J'ai vérifié et je suis tout à fait sûr que le programme n'est pas en cours d'exécution en arrière-plan et pourtant mon adresse est encore en usage.
ALORS, comment puis-je manuellement (ou autre) à proximité d'une prise/de l'adresse de mon programme peut immédiatement ré-utiliser?
Mise à jour
Basé sur la réponse de Mike j'ai vérifié les socket(7)
page et regarda SO_REUSEADDR:
SO_REUSEADDR Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses. For AF_INET sockets this means that a socket may bind, except when there is an active listening socket bound to the address. When the listen‐ ing socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address. Argument is an integer boolean flag.
- Toute opposition à ce que ce DONC? Il a fini par être un tout problème de programmation, il est donc probablement plus de sens là
- Pas du tout, je n'ai posté ici parce que je pensais à une commande Linux pour fermer le socket, je suis d'accord sa programmation de matériel. Peut-être le titre pourrait être modifié pour refléter le fait que c'était un programme en Python.
- Shickadance migré, vous aurez à reformuler le titre si vous pensez que c'est nécessaire.
- Voir aussi Comment forcer la fermeture d'un socket en TIME_WAIT
Vous devez vous connecter pour publier un commentaire.
Supposons que votre prise est nommé
s
... vous devez définirsocket.SO_REUSEADDR
sur la socket du serveur avant de se lier à une interface... ce qui vous permettra de redémarrer immédiatement un serveur TCP...setsockopt
, et je l'ai essayé mais toujours pas de chance. Je vais rendre compte après plus de tests.setsockopt()
... j'ai fait une faute de frappeVous pouvez essayer en utilisant Tordu pour votre réseau. Mike a donné le bon à faible niveau de réponse,
SO_REUSEADDR
, mais il ne mentionne pas que ce n'est pas une très bonne option à régler sur Windows. C'est le genre de chose que Tordu prend en charge pour vous automatiquement. Il y a beaucoup, beaucoup d'autres exemples de ce genre d'alésage de faible niveau de détail que vous avez à faire attention lors de l'utilisation de la douille du module directement, mais qui vous pouvez oublier si vous utilisez un niveau plus élevé de la bibliothèque comme Tordu.Vous êtes à confusion, les sockets, les connexions et les ports. Les Sockets sont des ordinateurs de connexions, qui sont elles-5-n-uplets {protocole local ip, local de-port, remote-ip, télécommande-port}. Les tués du programme socket a été fermée par le système d'exploitation, et idem la connexion. La seule relique de la connexion est le pair de la prise et le port correspondant de l'homologue de l'hôte. Donc, ce que vous devriez vraiment se demander est de savoir comment réutiliser les locaux port. La réponse est SO_REUSEADDR comme pour les autres réponses.