Socket异步通信中的EAGAIN错误

来源:互联网 发布:看盘软件下载 编辑:程序博客网 时间:2024/05/26 07:27

在Linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno代码为11(EAGAIN),这表明在非阻塞模式下调用了阻塞操作,在该操作无法完成时返回这个错误。这个错误不会破坏socket的同步,不需要特别处理,继续对socket执行read操作即可。

另外,如果出现EINTR(errno为4),错误描述Interrupted system call,操作也应该继续。

最后,如果recv的返回值为0,表明连接断开,此时可以关闭socket了。

下边给出一个简单的读取socket的例子:

#include < assert.h >#include < errno.h >#include < stdio.h >#include < unistd.h > int Recv(int sock, void *data, int len){if(sock == 0)return -1;         assert(m_sock > 0 && len >= 0); int ret, nread = 0; unsigned char *p = (unsigned char *)data; while(nread < len){ret = read(sock, p + nread, len - nread); if(ret < 0 && (errno == EAGAIN || errno == EINTR))continue; if(ret < 0){perror("ERROR socket read");return -1;} if(ret == 0)return -2; nread += ret;} return nread;}


0 0