Comment détecter une déconnexion de socket? / Comment appeler Socket.recv avec un délai d'expiration?

StackOverflow https://stackoverflow.com/questions/6009365

Question

J'utilise une prise correcée Gevent pour me connecter à un serveur de streaming et j'utilise une connexion ADSL.

Je ne contrôle pas le serveur mais dans mes tests, si j'arrête le serveur, je peux détecter la déconnexion en vérifiant simplement si le résultat de RECV est une chaîne vide, mais si j'éteins mon modem ADSL, RECV ne sort jamais. Si je déconnecte simplement le câble réseau de mon ordinateur, il ne renvoie pas non plus de chaîne vide, mais lorsque je le reconnecte, il renvoie tout ce que le serveur a envoyé en attendant, donc je suppose que le routeur ou le modem garde la connexion ouverte pour moi et tamponner le flux pendant que mon câble réseau est déconnecté.

J'ai essayé de définir socket.so_rcvtimeo à quelques secondes, mais il n'a pas détecté la déconnexion, RECV continue de "bloquer" pour toujours. C'est Gevent, donc il ne bloque que la Greenthread, mais je dois détecter cette déconnexion dès que possible afin que je puisse essayer de me reconnecter.

Était-ce utile?

La solution

Utilisez les délais d'expiration fournis par Gevent, par exemple dans une stades:

with Timeout(5, False):
    data = sock.recv()

ou en fonction:

data = gevent.with_timeout(5, sock.recv, timeout_value="")

Autres conseils

Il ne détecte pas la déconnexion car il n'y a pas de déconnexion, la "connexion" TCP est toujours vivante et supposait être fiable. Si, par exemple, vous débranchez votre câble LAN et que vous le repérez, la connexion fonctionnera toujours.

Si vous souhaitez vraiment détecter la déconnexion dès que possible, je suppose que vous devez simplement analyser chaque seconde l'état du réseau OS (ifconfig / ipconfig) / ou utiliser les événements du système d'exploitation et faire ce que vous voulez lorsque vous détectez la déconnexion du réseau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top