我正在使用非阻塞客户端套接字来读取数据。
有时读取返回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
}
答案 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.出现此错误,您可以从上游级别执行恢复。