我是靠谱客的博主 孝顺指甲油,这篇文章主要介绍EAGAIN、EWOULDBLOCK、EINTR与非阻塞的理解,现在分享给大家,希望可以做个参考。

当socket设置为非阻塞的情况时(设置方法参考该文)

在select的时候,或者read的时候,都会遇到错误,并返回errno,

我们查看errno.h中会看到:

#define EINTR             4   /* Interrupted system call  */

#define EAGAIN          11  /* Resource unavailable, try again          */

#define EWOULDBLOCK    EAGAIN 

由上面可以看出来,EWOULDBLOCK与EAGAIN 等价,我们当做一个errno处理即可。

select示例:


for(;;)
{
status = select(socket + 1, &fd_read, (fd_set *)0, (fd_set *)0, &wwait);
if(status < 0)
{
if((errno == EINTR) || (errno == EAGAIN))
continue;
printf("%s", strerror(errno));
return -1;
}
else if(status == 0)
{
//timeout
printf("%s", strerror(errno));
return 0;
}
break;
}

 read示例:

int myfunc(int length,int socket,char *pBufRecv)
{
int nleft, nread;
nleft = length;
while(nleft > 0)
{
nread = recv(socket, pBufRecv, nleft,0);
//if the connection has been gracefully closed, the return value is zero.
if(nread == 0)
{
printf("%s", strerror(errno));
return -1;
}
if(nread < 0)
{
if(errno == EINTR ||(errno == EAGAIN))
continue;
if(errno == EWOULDBLOCK)
continue;
printf("%s", strerror(errno));
return -1;
}
nleft -= nread;
pBufRecv += nread;
}
return(length - nleft);
}

 

最后

以上就是孝顺指甲油最近收集整理的关于EAGAIN、EWOULDBLOCK、EINTR与非阻塞的理解的全部内容,更多相关EAGAIN、EWOULDBLOCK、EINTR与非阻塞内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(117)

评论列表共有 0 条评论

立即
投稿
返回
顶部