Python Sockets: Как определить, когда клиент отключился изящно? (например, отключение WiFi) - PullRequest
2 голосов
/ 15 апреля 2019

Я пишу пару сценариев клиент / сервер, где важно поддерживать соединение, а также быстро обнаруживать, когда клиент отключается. Сервер обычно только отправляет данные, поэтому, чтобы проверить, нормально ли отключился клиент, я установил сокет в режим тайм-аута и проверил, что он возвращает:

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 независимо от того, отключился ли клиент.

...