+ -
当前位置:首页 → 问答吧 → 关于用select设置connect超时问题

关于用select设置connect超时问题

时间:2010-08-16

来源:互联网

  1. ...//connect之前省略
  2. if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) == -1)
  3. {
  4.     if (errno == EINPROGRESS)
  5.     {
  6.         tv.tv_sec = 0;
  7.         tv.tv_usec = 0;
  8.         FD_ZERO(&writefds);
  9.         FD_SET(s, &writefds);
  10.         if(select(s+1, NULL, &writefds, NULL, &tv)>0)
  11.         {
  12.             int len=sizeof(int);
  13.             getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len);
  14.             if(error==0)
  15.             {
  16.                 return s;
  17.             }
  18.             else
  19.                 goto error;//目前由于服务端没启动,程序是执行到这里退出。
  20.         }
  21.         else
  22.             goto error;//timeout or error happen
  23.     }
  24.     else
  25.         goto error;
  26. }
  27. return s;
复制代码


我想把select中timeval设为0,这样肯定会连接不成功吧?(我猜的。。。)然后我接着去写这个socket,如果失败接着又调用connect,这不死循环了吗?
该如何解决?或者有什么方法判断socket还在握手中,直到彻底失败再调用connect?

作者: anyc   发布时间: 2010-08-16

没明白设置成0的目的是什么

作者: hellioncu   发布时间: 2010-08-16

回复 hellioncu


    就想快点

作者: anyc   发布时间: 2010-08-16



QUOTE:
回复  hellioncu


    就想快点
anyc 发表于 2010-08-16 16:18




    那样较大的可能连接没有建立完成,后面也不能做什么,有啥意义呢

作者: hellioncu   发布时间: 2010-08-16

回复 hellioncu


    但就这段代码而言,这段程序结束之后,连接是否还继续进行?

作者: anyc   发布时间: 2010-08-16



QUOTE:
回复  hellioncu


    但就这段代码而言,这段程序结束之后,连接是否还继续进行?
anyc 发表于 2010-08-16 16:27




    没有close,当然还在进行

作者: hellioncu   发布时间: 2010-08-16

热门下载

更多