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?
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)
$ ps -fA | grep python
501 81211 12368 0 10:11PM ttys000 0:03.12
python -m SimpleHTTPServer
$ kill 81211
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
Cela provoque le init (constructeur) à:
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
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!
Une solution simple qui a fonctionné pour moi est de fermer le terminal et de le redémarrer.
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.
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}')