2009-03-03 10 views
6

Recientemente he estado aprendiendo python y recién comencé a jugar con redes usando la biblioteca socket de python. Todo ha ido bien hasta hace poco cuando mi script terminó sin cerrar la conexión. La próxima vez que me encontré con el guión, me puso:Enlace de puerto de Python

File "./alert_server.py", line 9, in <module> 
    s.bind((HOST, PORT)) 
File "<string>", line 1, in bind 
socket.error: (98, 'Address already in use') 

Así que parece que algo está todavía enganchan al puerto, a pesar de que la secuencia de comandos de Python no se está ejecutando (y he verificado esto utilizando $px aux ¿Qué hay. Es extraño que después de un minuto más o menos, pueda ejecutar el script nuevamente en el mismo puerto y estará bien. ¿Hay alguna forma de evitar/desvincular un puerto cuando esto ocurra en el futuro?

Respuesta

14

Lo que desea que hacer es justo antes de bind, do:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

La razón por la que está viendo el comportamiento es que el sistema operativo está reservando ese puerto en particular durante un tiempo después de que finalizó la última conexión. Esto es para que pueda descartar correctamente cualquier paquete adicional perdido que pueda entrar después de que la aplicación haya finalizado.

Al establecer la opción de socket SO_REUSEADDR, le está diciendo al sistema operativo que sabe lo que está haciendo y aún desea vincularse al mismo puerto.

+1

Además, es posible que desee llamar a shutdown() y cerrar() en el socket. –

Cuestiones relacionadas