这篇文章主要介绍einprogress错误码的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Linux非阻塞connect,错误码:EINPROGRESS,EINPROGRESS115/*Operationnowinprogress*/,这是正确的。和windows不同的是,这里显示EINPROGRESS,windows应该是EWOULDBLOCK。感觉linux的这种表述更准确一些,确实是EINPROGRESS(正在处理),而EWOULDBLOCK应该是在网卡或者系统繁忙、无法及时处理数据。
EINPROGRESS怎么弄
当我们以非阻塞的方式来进行连接的时候,返回的结果如果是-1,这并不代表这次连接发生了错误,如果它的返回结果是EINPROGRESS,那么就代表连接还在进行中。后面可以通过poll或者select来判断socket是否可写,如果可以写,说明连接完成了
无阻塞情况connect生产EINPROGRESS错
今天的游戏开发client测试程序,非常多,因为出现client。后connect成功。代码证recv系统调用。后来发现,可能是由于socket默认模式被阻止,这将使很多client
接处于链接却不能数据传输状态。
后来改动socket为非堵塞模式,但在connect的时候,发现返回值为-1,刚開始以为是connect出现错误,但在server上看到了链接是ESTABLISED状态。
证明链接是成功的
但为什么会出现返回值是-1呢?经过查询资料,以及看stevens的APUE,也发现有这么一说。
当connect在非堵塞模式下,会出现返回-1值。错误码是EINPROGRESS,但怎样推断connect是联通的呢?stevens书中说明要在connect后,继续推断该socket是否可写?
若可写,则证明链接成功。怎样推断可写,有2种方案,一种是select推断是否可写,二用poll模型。
select:
intCheckConnect(intiSocket)
{
fd_setrset;
FD_ZERO(&rset);
FD_SET(iSocket,&rset);
timevaltm;
tm.tv_sec=0;
tm.tv_usec=0;
if(select(iSocket+1,NULL,&rset,NULL,&tval)<=0)
{
close(iSocket);
return-1;
}
if(FD_ISSET(iSocket,&rset))
以上是“einprogress错误码的解决方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。