Piszę aplikację w Pythonie 2.7.5, używając interfejsu gniazda raw (import socket
).Python: wykrywanie, gdy gniazdo zostanie odłączone z jakiegokolwiek powodu?
Muszę wiedzieć, czy istnieje sposób, w jaki mogę zarejestrować jakieś zdarzenie lub łatwo przetestować w regularnych odstępach czasu, jeśli połączenie z gniazdem TCP jest nadal połączone i ustanowione.
Większość porad, które znalazłem, mówi: "po prostu spróbuj odczytać z niego, jeśli jest zamknięte, dostaniesz błąd lub nie będzie żadnych bajtów". Czasami jednak nie jestem gotowy na to, aby read
, ale nadal chcę wiedzieć, czy gniazdo zostanie zamknięte, więc na przykład mogę ręcznie ponownie połączyć się natychmiast.
Ponadto, z gniazda usunięto by bajty odczytane z bufora, więc read
po prostu w celu przetestowania połączenia "na żywo" nie wydaje się wykonalne.
Posiadanie wątku tła w celu sprawdzenia żywotności połączenia byłoby w porządku ze mną. Ten wątek może sprawdzać raz na sekundę, aby sprawdzić, czy połączenie jest aktywne; jeśli zostanie upuszczone, może wywołać funkcję lub ustawić zmienną lub inną rzecz, aby aplikacja wiedziała, że połączenie zostało zamknięte. Znajomość DLACZEGO zamknął (reset przez peer, timeout, itp.) Byłoby jeszcze bardziej przydatne ....
Wszelkie porady na ten temat?
na posix; użyj 'select()' (lub 'epoll()' dla Linux) – tMC
Powiązane: http://stackoverflow.com/questions/17705239/is-there-a-way-to-detect-that-tcp-socket-has -been-closed-by-the-remote-peer-wit (TL; DR: nie ma dobrego sposobu, aby dowiedzieć się, czy połączenie zostało zamknięte, chyba że chcesz przeczytać wszystkie bajty przychodzące z gniazda; Gniazda TCP są implementowane w ten sposób celowo, ponieważ opierają się na idei porządkowania zdarzeń FIFO, tzn. Chcą, abyś odczytywał przychodzące dane w kolejności i tylko dowiedział się o końcu strumienia po przeczytaniu go wszystkie) –