概述
当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与非阻塞的理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复