socket sheet español cheat bloqueante all python sockets

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 !")