ОШИБКА при принятии: ресурс временно недоступен - PullRequest
7 голосов
/ 03 октября 2011

Я пытаюсь создать однопоточный сервер в linux (red-hut) в C, который будет прослушивать несколько сокетов.

Мне нужно использовать неблокирующие сокеты, когда я устанавливаю флаги как неблокировка так:

int flagss = fcntl(socketfds[j],F_GETFL,0); 
flagss |= O_NONBLOCK;
fcntl(socketfds[j],F_SETFL,flagss);

Я получаю:

ERROR on accept: Resource temporarily unavailable

В остальном все работает отлично.

1 Ответ

15 голосов
/ 03 октября 2011

Ресурс, временно недоступный - EAGAIN, и это не является ошибкой. Это означает: «У меня нет ответа для вас прямо сейчас, а вы сказали мне не ждать, поэтому я возвращаюсь без ответа».

Если вы устанавливаете прослушивающий сокет в неблокирующее состояние, как вы это делаете, accept должен установить значение errno на это значение, когда нет клиентов, пытающихся подключиться. Вы можете ожидать входящее соединение, используя select (традиционный) или poll (семантически эквивалентный, более новый интерфейс, предпочтительный, если вам не нужно работать на каком-то старом Unix без него) или epoll (оптимизированный для тысяч дескрипторов, Linux -специфичные) системные вызовы.

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

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