阅读和EAGAIN

时间:2011-03-10 21:56:47

标签: iphone ios macos sockets

我正在使用非阻塞客户端套接字来读取数据。

有时读取返回EAGAIN。

处理它的正确方法是什么?

目前,我的代码会立即重试。很少担心它,因为如果读取不断返回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 个答案:

答案 0 :(得分:1)

获得EAGAIN后,您应该停止阅读,然后再次选择套接字。选择会告诉你什么时候可以阅读更多。

答案 1 :(得分:0)

从这篇文章的标签中,我假设您在iOS上尝试了这段代码。 EAGAIN意味着在大多数平台上再试一次。但是,这意味着资源暂时不可用。你可以在这里找到参考。 http://www.ioplex.com/~miallen/errcmp.html

就处理它的正确方法而言,您可能会发现CFNetwork的应用方式。请查看CFSocketStream.c中的 _SocketStreamRead http://www.opensource.apple.com/source/CFNetwork/CFNetwork-129.13/Stream/CFSocketStream.c

处理的想法不是将EAGAIN视为正常错误。相反,通过清除读取标志并继续循环,该过程最终将导致POSIX错误110.出现此错误,您可以从上游级别执行恢复。