2013-07-11 3 views
0

в Unix Network Programming by Stevens и другие неблокирующие сокеты проиллюстрированы кодом, использующим select call. Тот самый вызов, который обычно выбирается между блокировкой дескрипторов файлов.выберите в неблокирующей конструкции код c

Мое понимание заключалось в том, что неблокирующий дизайн был в точности альтернативой выбору: вместо блокировки в выборе вызова мой код мог бы проверять неблокирующие дескрипторы и выполнять что-то еще поверх этого. Было ли мое понимание неправильным или есть что-то загадочное в выборе звонка, что делает его неизбежным в неблокирующем дизайне?

По практическим соображениям мне нужно работать с большим количеством гнезд tcp, накладывая «индивидуальный» тайм-аут на каждый из них. Я думал о том, чтобы использовать неблокирующий дизайн и цикл через соответствующие массивы. Было бы уместно без выбора?

спасибо.

+2

Не правильное понимание. Неблокирующие сокеты не предназначены для устранения блокировки на 'select'. Они предназначены для устранения блокировки на 'send',' recv', 'connect' и других операциях. Из тех 'connect' особенно сложно, как и для блокирующих сокетов, он не может быть мультиплексирован с помощью' select'. С неблокирующими сокетами вы можете полностью исключить 'select' или использовать его всякий раз, когда это имеет смысл, и использовать периодические проверки в других случаях. –

+0

Что вы имеете в виду, «личный тайм-аут для каждого из них»? Вы имеете в виду, что каждый сокет имеет настраиваемый таймер бездействия, после которого соединение отбрасывается? –

+0

@ н.м. Спасибо, это на самом деле именно то, что я хотел бы убедиться: возможность отмены выбора вызова с неблокирующими сокетами. – wick

ответ

0

Настраиваемый таймер бездействия не должен иметь никакого отношения к вызову select(). сохраняйте свой массив таймеров отдельно, обновляйте их на каждом тике или каждые <x> итераций через цикл событий, каждый раз, когда связанный сокет имеет активность, перезагружает каждый таймер, закрывая его, когда неактивность достигает порога. Это не имеет никакого отношения к тому, как вы на самом деле обрабатываете ввод/вывод.

Независимо от того, используете ли вы select(), ортогонально, используете ли вы неблокирующие сокеты. select() не должно мешать вам блокировать чтение. Что select() предназначено для того, чтобы вы не блокировали , когда вы не хотите. (И не только при чтении: вы всегда можете позвонить select() с нулевым таймаутом, а select() не заблокирует). Кроме того, он обеспечивает механизм для того, чтобы знать, когда есть вход, который намного эффективнее, чем «перебирать весь мой набор сокетов, пытаясь неблокировать read() на каждом по очереди».

+0

Aha! так что это то место, где я преуменьшен, почему выбор более эффективен, чем просто расчесывать дескрипторы в неблокирующем режиме? Кроме того, что такое верхний предел количества дескрипторов - это не так много для выбора - не так ли? – wick

+0

Верхний предел для дескрипторов, которые могут обрабатывать 'select()', составляет чуть больше тысячи, но если это проблема, ваша ОС, как правило, будет иметь альтернативы для реализации, которые предоставляют возможность для большего набора. –

+0

Что касается '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' есть ли какие-либо из них? и передавая ответ вам, где вы можете затем выполнить чтение специально для подмножества дескрипторов, для которых есть фактически вход. –

Смежные вопросы