2016-06-20 6 views
0

Есть ли способ, с помощью которого я могу сделать функцию чтения сокетов как неблокирующую. У меня многопоточное серверное приложение, я хочу, чтобы моя функция accept() была блокирующей , но функция read() должна быть неблокирующей и должна возвращать EAGAIN, когда нет данных для чтения.Как сделать функцию чтения сокета неблокирующей

Я попытался сделать чтение() неблокируемому по

fcntl(sock, F_SETFL, O_NONBLOCK); 

но он начал давать мне ресурс временно недоступен ошибка.

+0

Функция 'int socket (int domain, int type, int protocol);' поддерживает опцию 'O_NONBLOCK' как тип. Вы пробовали использовать его? – Omar

+0

@ Омар да, я использую приведенное выше. –

+0

@Omar: Fresher вызывает 'accept()' и хочет, чтобы он блокировался, поэтому 'O_NONBLOCK' не может использоваться в гнезде для прослушивания. Даже если бы это было так: «O_NONBLOCK» не наследуется принятыми клиентскими сокетами, поэтому он должен применяться с помощью 'fcntl()' на каждом отдельном клиентском сокете после его принятия. –

ответ

1

«Ресурс временно недоступен» is EAGAIN.

Он работает правильно.