web-dev-qa-db-fra.com

Adresse Python [Errno 98] déjà utilisée

Dans mon programme de socket Python, j’ai parfois besoin de l’interrompre avec Ctrl-C. Lorsque je fais cela, il ferme la connexion en utilisant socket.close().

Cependant, lorsque j'essaie de le rouvrir, je dois attendre ce qui semble être une minute avant de pouvoir me reconnecter. Comment ferme-t-on correctement un socket? Ou est-ce prévu?

75
skylerl

Oui, c'est prévu. Ici vous pouvez lire explication détaillée . Il est possible de remplacer ce comportement en définissant l'option SO_REUSEADDR sur un socket. Par exemple:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
96
Bartosz
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211
21
ayoub laaziz

Si vous utilisez un serveur TCPServer, UDPServer ou leurs sous-classes dans le module SocketServer, vous pouvez définir cette variable de classe (avant d'installer un serveur):

SocketServer.TCPServer.allow_reuse_address = True

(via SocketServer.ThreadingTCPServer - Impossible de se connecter à l'adresse après le redémarrage du programme )

Cela provoque le init (constructeur) à:

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
15
dirkk0

Rien ne fonctionnait pour moi excepté l'exécution d'un sous-processus avec cette commande, avant d'appeler HTTPServer (('', 443), myHandler):

kill -9 $ (lsof -ti tcp: 443)

Bien sûr, cela ne concerne que les systèmes d'exploitation de type Linux!

2
Mirko

Une solution simple qui a fonctionné pour moi est de fermer le terminal et de le redémarrer.

2
Siddharth Sethia

Vous avez la même erreur:
Étapes suivies:
1 - utilisé $ ps -fA | grep python
2 - Tué tout le processus
3 - Terminal fermé
4 - a relancé et lancé l'application (mkchromecast).
5 - n'a pas eu ce message d'erreur.

Vous avez un autre problème. suivi sur cela.

0
vb217

parce que vous essayez d'exécuter le service sur le même port que celui qui est déjà en cours d'exécution.

cela se produit parfois car votre service n'est pas arrêté dans la pile de processus. tu dois les tuer

voici la commande d'une ligne pour tuer tous les processus python en cours d'exécution.

pour un système d'exploitation Linux:

kill -9 (ps -A | grep python | awk '{print $1}')
0
MohitGhodasara