Я пишу пару сценариев клиент / сервер, где важно поддерживать соединение, а также быстро обнаруживать, когда клиент отключается. Сервер обычно только отправляет данные, поэтому, чтобы проверить, нормально ли отключился клиент, я установил сокет в режим тайм-аута и проверил, что он возвращает:
try: # check if client disconnect
c.settimeout(1)
if not (c.recv(1024)):
print("## Socket disconnected! ##")
c.settimeout(None)
closeConnection(c)
return
except Exception as e:
print(e)
c.settimeout(None)
Это работает мгновенно, если я закрываю клиента. Однако, если я отключаю WiFi на клиентском компьютере, recv на сервере ничего не возвращает. Просто время истекает, как если бы соединение было установлено, но ничего не отправлялось.
Я пытался использовать send () для отправки пустых сообщений клиенту в качестве способа опроса. Когда я это делаю, операция завершается успешно и возвращает 0 независимо от того, отключился ли клиент.