Soy nuevo en la programación de sockets y me encontré con un problema desconcertante:toma Python hace conexión no se cierre correctamente
que tienen un programa de Windows que no puedo alterar (software propietario), pero que intenta conectarse a una dirección IP específica y puerto con un zócalo de tcp.
En mi linux box escribí un pequeño script de python para servir el socket al win prog. Esto funciona bien hasta que mate mi programa en Linux. El socket del servidor inicial no se cierra como se especificó y no puedo reiniciar mi programa hasta que el socket sea basura.
Si intento lo mismo con un socket de Linux (en un script de python separado) no tengo problemas.
Aquí es un ejemplo de código mínima:
import socket
server = socket.socket()
server.bind(('192.168.0.111', 50001))
server.listen(1)
conn, addr = server.accept()
print 'Connection established'
running = True
while running:
try:
data = conn.recv(4096)
except KeyboardInterrupt:
conn.close()
running = False
else:
if data:
print data
else:
conn.close()
running = False
server.close()
Si mato esto con Ctrl-C que sale normalmente. Pero al reiniciar el script me sale un socket.error que indica que la dirección ya está en uso. Después de un minuto o así el programa funciona nuevamente.
También probé un apagado antes del cierre (también conocido como conn.shutdown (2) y server.shutdown ...) pero eso no tiene ningún efecto.
¿Hay una mejor manera "correcta" de cerrar un socket de Windows? ¿Extraño algo fundamental sobre los enchufes en general?
Gracias!
edición: Creo que acabo de ver la respuesta aquí: what is the correct way to close a socket in python 2.6?
Aunque estoy usando Python 2.5 todavía podría funcionar.
'echo "desconexión" | nc 192.168.1.12 58888 -w 1' - del lado del cliente puede hacer un tiempo de espera de 1 segundo y dejar que el servidor tenga su propio time_out – YumYumYum