第二种更通用的、使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. myeclipse10 .jsp将表单提交给.java(form网页与后台通信初识)

    做毕设需要用到form通信. 以下几张截图来自极课学院 servlet jsp文件 web配置 出现错误: 路径问题 仍然不对,需要再改 <form action="servlet/S ...

  2. 块级&行内(内联)元素

    行内元素列表 <a>标签可定义锚 <abbr>表示一个缩写形式 <acronym>定义只取首字母缩写 <b>字体加粗 <bdo>可覆盖默认的 ...

  3. li标签行内元素高度及居中

    <head> <title><title> <style type="text/css"> * { padding: 0px; ma ...

  4. ASP.NET MVC4系列验证机制、伙伴类共享源数据信息(数据注解和验证)

    一,mvc前后台验证 自定义属性标签MyRegularExpression using System; using System.Collections.Generic; using System.C ...

  5. vim vi 及其相关插件的使用

    GIMP->linux下16位图查看工具 实用手册:130+ 提高开发效率的 vim 常用命令 http://www.cnblogs.com/lhb25/p/130-essential-vim- ...

  6. Apache Spark源码走读之20 -- ShuffleMapTask计算结果的保存与读取

    欢迎转载,转载请注明出处,徽沪一郎. 概要 ShuffleMapTask的计算结果保存在哪,随后Stage中的task又是如何知道从哪里去读取的呢,这个过程一直让我困惑不已. 用比较通俗一点的说法来解 ...

  7. P1018 乘积最大

    开始定义状态f[i][j][k]为[i,j)区间插入k个括号,使用记忆化搜索,但是成功爆栈,得到4个mle #include <bits/stdc++.h> using namespace ...

  8. 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

      分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ...

  9. transform animation transition css3动画

    transform 定义   transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. 值 应用  如果transform与transition联合起 ...

  10. Bluetooth Baseband介绍

    目录 1. 概述 1.1 Clock(时钟) 1.2 寻址方式 2. 物理信道(Physical Channels) 3. 物理链路(Physical Links) 4. 逻辑传输层(Logical ...