sheet - Python: ¿Detectar cuando un socket se desconecta por alguna razón?
socket python 3 español (2)
Use select
como este tutorial sugerido en http://docs.python.org/2/howto/sockets.html#non-blocking-sockets
Si un socket se encuentra en la lista legible de salida, puede estar tan cerca de estar seguro de que cada vez que entramos en este negocio que una recv en ese socket devolverá algo. La misma idea para la lista de escritura. Podrás enviar algo. Tal vez no todo lo que quieras, pero algo es mejor que nada. (En realidad, cualquier socket razonablemente saludable se devolverá como escribible, solo significa que hay espacio disponible para el búfer de la red de salida).
... si en algún lugar de esas listas de entrada de sockets hay una que ha muerto de una muerte desagradable, la selección fallará.
Este es el flujo que suelo usar
import select
import socket
ip = ''127.0.0.1''
port = 80
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect((ip, port))
while True:
try:
ready_to_read, ready_to_write, in_error = /
select.select([conn,], [conn,], [], 5)
except select.error:
conn.shutdown(2) # 0 = done receiving, 1 = done sending, 2 = both
conn.close()
# connection error event here, maybe reconnect
print ''connection error''
break
if len(ready_to_read) > 0:
recv = conn.recv(2048)
# do stuff with received data
print ''received:'', recv
if len(ready_to_write) > 0:
# connection established, send some stuff
conn.send(''some stuff'')
Estoy escribiendo una aplicación en Python 2.7.5 utilizando la interfaz de socket sin procesar ( import socket
).
Necesito saber si hay alguna forma de registrar algún tipo de evento, o probar fácilmente en un intervalo regular, si una conexión de socket TCP aún está conectada y establecida.
La mayoría de los consejos que he encontrado dicen cosas como "solo trata de leerlo; si está cerrado obtendrás un error o no bytes". Sin embargo, a veces no estoy listo para read
, pero aún quiero saber si el zócalo se cierra, así que, por ejemplo, puedo volver a conectarme manualmente de inmediato.
Además, la read
desde el socket eliminaría los bytes leídos del búfer, por lo que la read
simplemente para comprobar la "vida" de la conexión no parece factible.
Tener un hilo de fondo para verificar la vida de conexión estaría bien conmigo. Ese hilo podría verificar una vez por segundo para ver si la conexión está activa; si se cae, podría llamar a una función, o establecer una variable o alguna otra cosa para que la aplicación sepa que la conexión está cerrada. Saber POR QUÉ se cerró (restablecer por interlocutor, tiempo de espera, etc.) sería aún más útil ...
¿Algún consejo sobre esto?
prueba esto :
if len(recv) == 0:
print("disconnected fired !")