Поддельные recv () EAGAIN на OSX? - PullRequest
0 голосов
/ 28 марта 2011

Редактировать: Проблема решена, я ранее неправильно назвал fcntl (sock, F_SETFL, FD_CLOEXEC) на сокете сервера. Это каким-то образом было сопоставлено маске, содержащей O_NONBLOCK, потому что FD_CLOEXEC предназначен для F_SETFD, а не F_SETFL и был унаследован также для клиентских сокетов.

Здравствуйте,

Я занимаюсь разработкой сетевого приложения на Mac OS X 10.4. Здесь происходит нечто странное: иногда - довольно регулярно и надежно - операция recv () на блокирующем сокете TCP возвращает -1, а для errno установлено значение EAGAIN.

Это очень странно, потому что, как уже говорилось, это блокирующий сокет. Также я не установил тайм-ауты приема - что в качестве состояния документов также может привести к возврату EAGAIN. Я использовал getsockopt (), чтобы убедиться, что таймаут отсутствует. Если я добавлю usleep () и снова вызову recv (), тогда я получу данные для следующих данных просто отлично.

Кто-нибудь сталкивался с этим раньше на OSX конкретно или на других системах?

Это приложение довольно простое. Он однопоточный, не использует singals, асинхронный ввод-вывод не выполняется.

Ответы [ 2 ]

0 голосов
/ 28 марта 2011

Я нашел свою ошибку:

Я вызвал fcntl (fd, F_SETFL, FD_CLOEXEC); когда я должен был использовать F_SETFD для этого флага: - (

Я не знаю, как именно это сопоставлено с маской, содержащей O_NONBLOCK - потому что они имеют разные значения - но это то, что произошло.

Спасибо за ваше время.

0 голосов
/ 28 марта 2011

Страница справочника гласит:

[EAGAIN] Сокет помечен как неблокирующий, и операция приема будет блокироваться, или установлен таймаут приема , ивремя ожидания истекло до получения данных.

обратите внимание на часть "timeout".

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