Редактировать: Проблема решена, я ранее неправильно назвал 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, асинхронный ввод-вывод не выполняется.