第二种更通用的、使connect调用超时的方法是使套接字成为无阻塞的,然后用select等待它完成。这种方法避免了使用alarm时遇到的很多问题,但我们必须承认,即使是在UNIX实现中,这种方法还是存在很多可移植性问题。

int main(int argc, char **argv)

{

  fd_set rdevents;

  fd_set wrevents;

  fd_set exevents;

  struct sockaddr_in peer;

  struct timeval tv;

  SOCKET s;

  int flags;

  int rc;

  INIT();

  set_address(argv[1], argv[2], &peer, "tcp");

  s=socket(AF_INET,SOCK_STREAM,0);

  if(!isvalidsock(s))

    error(1,errno,"socket call failed");

  if((flags=fcntl(s,F_GETFL,0)) <0)

    error(1,errno,"fcntl(F_GETFL) failed");

  if((rc = connect(s,(struct sockaddr *)&peer,

    sizeof(peer))) && errno != EINPROGRESS)

    error(1,errno,"connect failed");

  if(rc == 0)

  {

    if(fcntl(s,F_SETFL,flags) < 0)

      error(1,errno, "fcntl(restore flags) failed");

    client(s,&peer);

    EXIT(0);

  }

  FD_ZERO(&rdevents);

  FD_SET(s,&rdevents);

  wrevents = rdevents;

  exevents = rdevents;

  tv.tv_sec = 5;

  tv.tv_usec = 0;

  rc = select(s+1, &rdwvents, &wrevents, &exevents, &tv);

  if(rc < 0)

    error(1,errno, "select failed");

  else if(rc == 0)

    error(1,0, "connect timed out\n");

  else if(isconnected(s,&rdevents, &wrevents, &exevents))

  {

    if(fcntl(s, F_SETFL, flags) < 0)

      error(1 errno, "fcntl(restore flags) failed");

    client(s,&peer);

  }

  else

    error(1,errno, "connect failed");

  EXIT(0);

}

int isconnected(SOCKET s,fd_set *rd, fd_set *wr, fd_set *ex)

{

  int err;

  int len=sizeof(err);

  errno = 0;

  if(!FD_ISSET(s, rd) && !FD_ISSET(s, wr))

    return 0;

  if(getsockopt(s,SOL_SOCKET,SO_ERROR,&err,&len) < 0)

    return 0;

  errno = err;

  return err == 0;

}

connect调用超时的实现方式的更多相关文章

  1. accpet和connect设置超时

    三次握手 TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户 ...

  2. 客户端设置WebService调用超时时间

    刚接触WebService,对如何在客户端设置WebService调用超时时间查阅了一些资料,现总结如下: ============================================== ...

  3. Istio 网络弹性 实践 之 故障注入 和 调用超时

    网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 超时时间 工作中常常会碰到这样的开发.测试场景 ...

  4. feign调用超时

    Feign调用超时 feign调用超时 默认feign调用超时是1秒,断点调试是否调用成功肯定超时 feign.hystrix.enabled=true #feign调用默认是1000毫秒=1秒 ad ...

  5. connect设置超时的方法

    在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式socket,如果服务器当前不可用,则connect会等待知道超时时间到达,而这个超时时间是系统内核规定的,并不能使用setSo ...

  6. DLL调用的两种方式(IDE:VC6.0,C++)

    原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...

  7. Dubbo启动,调用方法失败【问题:调用超时】

    今天,启动dubbo,开始写项目. 在一个调用dubbo里面的一个方法时,程序一直调用,每次显示报红. 很难搞. 问题代码 com.alibaba.dubbo.rpc.RpcException: Fa ...

  8. python 模块调用的几种方式

    在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import  模块里面的小功能 3,from  模块 ...

  9. nginx调用PHP有sock方式和端口方式

    nginx调用PHP有sock方式和端口方式 1.确认nginx已经调用了php;2.先确认你的nginx使用什么方式调用PHP:3.如果使用端口方式,端口对不对应,如果使用SOCK方式,那么路径对不 ...

随机推荐

  1. opengl绘制正弦曲线

    利用opengl绘制正弦曲线 ,见代码: #include <windows.h> //#include <GLUT/glut.h> #include <GL/glut. ...

  2. 【新产品发布】【iCore2 ARM / FPGA 双核心板】

    iCore2是一款包含ARM / FPGA两大利器的双核心板.ARM方面,采用意法半导体高性能的32位Cortex-M3内核STM32F103VE微处理器,主频达72MHz,并包含丰富外设接口.FPG ...

  3. NBUT 1010 魔法少女(DP)

    [1010] 魔法少女 时间限制: 1000 ms 内存限制: 65535 K 问题描述 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙. ...

  4. JitterBuffer

    jitter buffer QoS的解决方案 注:此博客中的某些说法是有问题的,如65536的整数倍,则其buffer会太大=>64k*1.5k=98M,另在超时处理中也有问题 VOIP中何为动 ...

  5. POJ 1511 最短路spfa

    题很简单 就是有向图中求给出的源点到其余所有点的最短路的和与其余所有点到源点的最短路之和 一开始以为dij对于正权图的单源最短路是最快的 写了一发邻接表的dij 结果超时 把所有的cin改成scanf ...

  6. [kuangbin带你飞]专题六 最小生成树

    学习最小生成树已经有一段时间了 做一些比较简单的题还算得心应手..花了三天的时间做完了kuangbin的专题 写一个题解出来记录一下(虽然几乎都是模板题) 做完的感想:有很多地方都要注意 n == 1 ...

  7. MySQL update语句和insert插入语句写法完全不一样啊,不要搞混

    1.mysql update 语句: update user set name = 'xiaoming',age = 18 where uid = 3000; 更新记录时update操作也不需要写ta ...

  8. [源码]随机获取虾米音乐song_id API文件

    [源码]随机获取虾米音乐song_id API文件 January 11, 2015 注意:此API请放置于国内主机使用,如香港.北京等等,否则会提示:虾米音乐在您所处的国家或地区暂时无法使用 < ...

  9. git的某些默认行为--会推送pull的内容,即使commit的时候不显示

    今天一不小心又在git上犯了个大错误,用gitflow之前进行过pull分支的操作,然后用IDE选择修改的文件提交,可是推送的时候把pull的内容也推送到远程服务器了,提交的时候用git status ...

  10. ant

    condition逻辑判断: <project name="testCondition"> <target name="test"> & ...