Tengo una aplicación de Python que abre un socket TCP simple para comunicarse con otra aplicación de Python en un host separado. A veces, el programa puede tener un error o lo mataré directamente, y en cualquier caso, el socket se puede dejar abierto durante un tiempo desconocido.¿Cómo cerrar un socket dejado abierto por un programa destruido?
La próxima vez que vaya a ejecutar el programa me sale este error:
socket.error: [Errno 98] Address already in use
Ahora el programa siempre trata de utilizar el mismo puerto, por lo que parece como si todavía está abierta. Comprobé y estoy bastante seguro de que el programa no se está ejecutando en segundo plano y, sin embargo, mi dirección todavía está en uso.
SO, ¿cómo puedo cerrar manualmente (o de otra forma) un socket/dirección para que mi programa pueda volver a usarlo inmediatamente?
actualización
Sobre la base de la respuesta de Mike Revisé la página socket(7)
y miré 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.
¿Alguna oposición a mover esto a SO? Terminó siendo un problema completamente de programación, así que probablemente tiene más sentido allí –
No, en absoluto, solo publiqué esto aquí porque estaba pensando en un comando de Linux para cerrar el socket, estoy de acuerdo con su material de programación. Quizás el título podría cambiarse para reflejar que era un programa de Python. –
@Mr. Shickadance migró, tendrás que volver a escribir el título si lo crees necesario. – xenoterracide