现在的位置: 首页 > web前端 > 正文

einprogress错误码怎么办

2020年07月16日 web前端 ⁄ 共 1065字 ⁄ 字号 评论关闭

  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给大家简单的介绍了一些,希望大家多看看。

抱歉!评论已关闭.