читать и EAGAIN - PullRequest
       2

читать и EAGAIN

1 голос
/ 11 марта 2011

Я использую неблокирующий клиентский сокет для чтения данных.

Иногда чтение возвращает EAGAIN.

Как правильно обращаться с этим?

В данный момент мой код повторяется сразу навсегда.Немного беспокоюсь об этом, поскольку существует вероятность бесконечного цикла, если read продолжает возвращать EAGAIN.

s = socket(...);
ioctl(s, FIONBIO, ON);
select(s+1, r, NULL, e, NULL);
if (FD_ISSET(s, r)) {
  ret = read(...)
  ret = read(...)
  ret <---- is EAGAIN sometimes
}

Ответы [ 2 ]

1 голос
/ 11 марта 2011

После того, как вы получите EAGAIN, вы должны прекратить чтение и снова выбрать сокет.select скажет вам, когда вы сможете прочитать больше.

0 голосов
/ 07 января 2014

Из тега этого поста я предполагаю, что вы попробовали этот кусок кода на iOS. EAGAIN означает попробовать еще раз на большинстве платформ. Однако это означает, что Ресурс временно недоступен. Вы можете найти ссылку здесь. http://www.ioplex.com/~miallen/errcmp.html

С точки зрения правильного подхода к нему вы можете найти способ применения CFNetwork. Пожалуйста, посмотрите на _SocketStreamRead в CFSocketStream.c http://www.opensource.apple.com/source/CFNetwork/CFNetwork-129.13/Stream/CFSocketStream.c

Идея обработки заключается не в том, чтобы рассматривать EAGAIN как нормальную ошибку. Вместо этого, сняв флажок чтения и продолжив цикл, процедура в конечном итоге приведет к ошибке POSIX 110. С этой ошибкой вы можете выполнить восстановление с верхнего уровня потока.

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