select.select () не ловит исключительное условие на сокете? - PullRequest
4 голосов
/ 29 марта 2011

Python 2.7, Windows XP.У меня есть сервер, который отправляет сообщения на клиент (ы).Я использую модуль выбора для проверки розеток, готовых к приему, а также для обнаружения исключительных условий.У меня сложилось впечатление, что если бы клиент закрыл сокет, select () вернул бы указанный сокет в список сокетов исключительных условий, но, похоже, этого не происходит:

lin, lout, lex = select.select(socklist, socklist, socklist)
for sock in lin: 
    # handle incoming messages
for sock in lout: 
    # send updates
for sock in lex: 
    # shut down server-side objects for particular client

Что быбыть лучшим способом для сервера определить, подключен ли клиент?Сервер не всегда отправляет данные, поэтому я не хотел бы полагаться на socket.send (), чтобы проверить, есть ли еще клиент.

Ответы [ 3 ]

6 голосов
/ 29 марта 2011

Закрытый сокет не является исключением (ошибкой).Что произойдет, сокет будет в списке чтения (lin), и когда вы прочитаете, вы получите 0 байтов.Это означает, что другой конец закрыл сокет.

Обновление :

В обычной практике вы никогда не увидите ничего в списке исключений и можете спокойно его игнорировать.Это для редко используемых вещей, таких как внеполосные (OOB) и тому подобное.

Ответ на вопрос обновления :

Надежно и быстро обнаруживает, что другой конецрозетка ушла может быть сложно.Если важно определить его надежно, всегда и своевременно, вам следует использовать механизм более высокого уровня, например keepalive / heartbeat.

Если клиент выполняет чистое отключение сокета, вы должны увидетьсокет в списке чтения.Чтение из сокета вернет 0 байтов, что означает, что сокет закрыт (EOF).

2 голосов
/ 29 марта 2011

Точное определение «исключительных условий» в сокете зависит от базовой реализации. Для Windows XP базовой реализацией является функция выбора WinSock , а исключительные условия включают в себя:

  • При обработке вызова (неблокирующего) попытка подключения не удалась.
  • Данные OOB доступны для чтения
1 голос
/ 29 марта 2011

Клиент, закрывающий сокет, не является исключением. Это на самом деле ничего, кроме исключительных. Вы получите различные ошибки в списке исключительных условий, но правильно закрытый сокет не является одним из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...