在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;
}