Ради интереса, я возился с написанием балансировщика нагрузки на python и пытался найти лучший (правильный?) Способ проверить, доступен ли порт и удаленный хост все еще там.
Я обнаружил, что после подключения становится трудно определить, когда удаленный хост отключается. Я включил функцию keep alive, но не могу заставить ее распознавать сбитое соединение раньше, чем через минуту (я понимаю, что опрос чаще, чем за минуту, может быть излишним, но, допустим, я хотел), даже после установки различных TCP_KEEPALIVE Варианты до их самых низких.
Когда я использую неблокирующие сокеты, я заметил, что recv () вернет ошибку («ресурс временно недоступен»), когда он читает из живого сокета, но возвращает «» при чтении из мертвого (отправить и recv 0 байтов, что может быть причиной?). Это выглядит как странный способ проверить, подключен ли он, и делает невозможным определить, умерло ли подключенное устройство, но после отправки некоторых данных.
Помимо подключения / отключения при каждой проверке, что я могу сделать? Могу ли я вручную отправить протокол активности tcp или установить соединение более низкого уровня, которое позволит мне проверить подключение без отправки реальных данных, которые потенциально может обработать удаленный сервер?