Готов ли сокет в состоянии ошибки к чтению в соответствии с select ()? - PullRequest
2 голосов
/ 26 января 2011

(я использую CPython v2.6 (в Linux, Windows и OSX), но я не думаю, что мой вопрос относится к Python или моим целевым системам.)

Если мое приложение заблокировано вызовом select([sock], [], [], None) и удаленная сторона внезапно прервана, могу ли я рассчитывать на разблокировку моего вызова select, даже если я не выбираю ошибки?

Я знаю, что правильный способ сделать это - также проверить наличие ошибок в сокете (например, select([sock], [], [sock], None)), но в документации, которую я прочитал для select , говорится, что определение ошибки варьируется от система в систему.

1 Ответ

2 голосов
/ 15 июня 2011

Я не уверен, насколько это может зависеть от реализации, так как в этой области select () есть некоторая нечеткость в зависимости от того, как вы читаете man-страницу, но системы, над которыми я работал, возвращали сокеткак читаемый, и тогда ваше чтение вернет ошибку (предполагается, что TCP, конечно, и удаленная сторона имеет RST-соединение). Ключевая часть - дескриптор считается готовым, если возможно выполнить соответствующую операцию ввода-вывода (например,читать (2) без блокировки. "который, если чтение немедленно вернулось с ошибкой, было бы верным утверждением.Я бы порекомендовал проверить это поведение на ваших целевых системах, написав простой клиентский сервер, подключив клиент, а затем выбрав для чтения.Пусть сервер примет, поспит на секунду, а затем выйдет сам.Если то, что я обычно видел, является стандартным для вас, выбор вернется с сокетом как читаемым, и ваше чтение не будет блокироваться, но вернет ошибку сброса соединения.

О, да, и просто, чтобы это имело значениехуже (из страниц руководства Linux )

В Linux select () может сообщать дескриптор файла сокета как «готовый к чтению», но, тем не менее, при последующем чтении блокируется.Это может, например, произойти, когда данные поступили, но при проверке они имеют неверную контрольную сумму и отбрасываются.Могут быть другие обстоятельства, при которых файловый дескриптор ложно сообщается как готовый.Поэтому может быть безопаснее использовать O_NONBLOCK на сокетах, которые не должны блокироваться.

...