Возможно ли (и безопасно) сделать принимающий сокет неблокирующим?

я ищу способ прерватьaccept() вызов на сокет блокировки. Использование сигналов не вариант, так как это должно быть в библиотеке, и я нене хочу загромождать пользовательские сигналы. С помощьюselect() это еще один вариант, но по разным причинам этоне очень привлекательно в моем случае.

Что бы хорошо работало, если возможно, это установить сокет в неблокирующий режим (используяfcntl() а такжеO_NONBLOCK) из другого потока, в то время как сокет заблокирован наaccept() вызов. Ожидаемое поведение таково, чтоaccept() звонок вернется сEAGAIN или жеEWOULDBLOCK в .errno

Будет ли это действительно работать так? Это безопасно? Портативный?

Если вы знаете о применимости этого метода для Windows (где вам нужно использоватьWSAIoctl() а такжеFONBIO) ЯЯ тоже заинтересован.

 Vlad Holubiev30 мая 2016 г., 03:33
fcntl(socket, F_SETFL, O_NONBLOCK); сделал трюк для меня

Ответы на вопрос(1)

Решение Вопроса

Понятия не имею о Windows, но POSIX гарантирует требуемое поведение:

Если очередь прослушивания пуста от запросов на соединение, а O_NONBLOCK не задан в файловом дескрипторе для сокета, accept () должен блокироваться, пока не будет установлено соединение. Если очередь listen () пуста от запросов на подключение и в дескрипторе файла для сокета установлена O_NONBLOCK, accept () должен завершиться с ошибкой и установить для errno значение [EAGAIN] или [EWOULDBLOCK].

Источник:http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html

Также,select или жеpoll может использоваться для проверки входящих соединений путем опроса сокета прослушивания в наборе чтения.

 Norswap14 окт. 2012 г., 01:08
Итак, определенный ответ таков:не возможно. Как в теории, так и на практике (в итоге я попробовал это как на Linux, так и на Windows).
 R..12 окт. 2012 г., 17:20
О, я неправильно понял ваш вопрос. Нет я неНе думайте, что меняете режим на неблокирующийs уже заблокирован, переносим. Почему Дон'т просто сделать его неблокирующим и использоватьpoll или жеselect доaccept звони, и только звониaccept если соединение доступно? Есть много чистых способов сделатьselect или жеpoll возвращайся рано, как трюк с самоотдачей.
 alk12 окт. 2012 г., 17:15
Вы уверены, что уже блокированиеaccept() вернется как указано, если переданный дескриптор файла получитO_NONBLOCK установить асинхронно? Ваша цитата кажется мне двусмысленной для этого случая.

Ваш ответ на вопрос