2010-12-16 22 views
69

En mi programa de socket Python, a veces necesito interrumpirlo con Ctrl-C. Cuando hago esto, cierra la conexión usando socket.close().Python [Errno 98] Dirección ya en uso

Sin embargo, cuando intento volver a abrirlo, tengo que esperar lo que parece un minuto para poder volver a conectarme. ¿Cómo se cierra correctamente un socket? ¿O es esto intencional?

Respuesta

92

Sí, está destinado. Aquí puede leer detailed explanation. Es posible anular este comportamiento configurando la opción SO_REUSEADDR en un socket. Por ejemplo:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
+0

Extraño. He llamado esto antes de enlazar y el error todavía está ocurriendo. Debo estar cometiendo un error en otro lugar. – byxor

+0

No importa, tuve una extraña condición de carrera cuando repetidamente ataba y cerraba hilos separados para mis pruebas automatizadas. – byxor

12

Si utiliza un TCPServer, UDPServer o sus subclases en el módulo SocketServer, puede establecer esta variable de clase (antes de instanciando un servidor):

SocketServer.TCPServer.allow_reuse_address = True 

(a través de SocketServer.ThreadingTCPServer - Cannot bind to address after program restart)

Esto hace que el init (constructor) a:

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

-> ps -fA | grep pitón

501 81211 12368 0 10:11 PM ttys000 0: 03.12
python -m SimpleHTTPServer

-> matar 81211

+1

No es la mejor respuesta, pero funciona :) – MartinH

+0

Desafortunadamente, no siempre funciona. Este fue mi pensamiento inmediato cuando me encontré con este problema, pero no hay un proceso de pitón que matar en mi caso. – Kryten

2

Nada funcionó para mí, excepto la ejecución de un subproceso con este comando, antes de llamar a HTTPServer (('', 443), myHandler):

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

por supuesto, esto es sólo para el sistema operativo Linux-como!

Cuestiones relacionadas