Я использую gevent patched socket для подключения к потоковому серверу, и я использую соединение adsl.
Я не контролирую сервер, но в моих тестах, если я остановлю сервер, я смогу обнаружить отключение, просто проверив, является ли результат от recv пустой строкой, но если я отключу мой adsl модем recvникогда не выходит.Если я просто отсоединяю сетевой кабель моего компьютера, он также не возвращает пустую строку, но когда я снова подключаю его, он возвращает все, что сервер отправил за это время, поэтому я предполагаю, что маршрутизатор или модем оставляют соединение открытым для меняи буферизация потока при отключенном сетевом кабеле.
Я попытался установить socket.SO_RCVTIMEO на несколько секунд, но он не обнаружил отключение, recv продолжает «блокировать» вечно.Это gevent, поэтому он блокирует только greenthread, но мне нужно как можно скорее обнаружить это отключение, чтобы попытаться восстановить соединение.