connect调用超时的实现方式
第二种更通用的、使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调用超时的实现方式的更多相关文章
- accpet和connect设置超时
三次握手 TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户 ...
- 客户端设置WebService调用超时时间
刚接触WebService,对如何在客户端设置WebService调用超时时间查阅了一些资料,现总结如下: ============================================== ...
- Istio 网络弹性 实践 之 故障注入 和 调用超时
网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 超时时间 工作中常常会碰到这样的开发.测试场景 ...
- feign调用超时
Feign调用超时 feign调用超时 默认feign调用超时是1秒,断点调试是否调用成功肯定超时 feign.hystrix.enabled=true #feign调用默认是1000毫秒=1秒 ad ...
- connect设置超时的方法
在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式socket,如果服务器当前不可用,则connect会等待知道超时时间到达,而这个超时时间是系统内核规定的,并不能使用setSo ...
- DLL调用的两种方式(IDE:VC6.0,C++)
原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...
- Dubbo启动,调用方法失败【问题:调用超时】
今天,启动dubbo,开始写项目. 在一个调用dubbo里面的一个方法时,程序一直调用,每次显示报红. 很难搞. 问题代码 com.alibaba.dubbo.rpc.RpcException: Fa ...
- python 模块调用的几种方式
在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import 模块里面的小功能 3,from 模块 ...
- nginx调用PHP有sock方式和端口方式
nginx调用PHP有sock方式和端口方式 1.确认nginx已经调用了php;2.先确认你的nginx使用什么方式调用PHP:3.如果使用端口方式,端口对不对应,如果使用SOCK方式,那么路径对不 ...
随机推荐
- html5文章 -- HTML5开发实例-网易微博手机Web App开发过程
HTML5在国内外越来越受到互联网开发团队的青睐.国外,谷歌兴致勃勃地开发Chrome Web Store,微软发布了支持使用HTML5技术开发的“Irish Spring”主题网站,诺基亚斥巨资购得 ...
- APP UI设计相关的一些链接
安卓app设计规范整理和Android APP设计篇 http://www.25xt.com/appdesign/6536.html APP UI面试题:iOS和安卓的ui设计有什么区别 http:/ ...
- php 实现qq第三方登录
学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博文分享!
- linux的信号机制
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件.注意,信号只是用 ...
- 用Editplus开发Java
☆ 准备工作 ①,已安装好jdk,同时配置系统变量(3个,JAVA_HOME,PATH,CLASSPATH) ②,电脑已安装Editplus,并做好设置. ☆ Editplus配置java开发环境 对 ...
- 正则匹配中文.PHP不兼容的问题
不使用: ^[\u4e00-\u9fa5_a-zA-Z0-9_]+$ 有可能兼容有问题 if(!preg_match_all("/^[\\x7f-\\xff_a-zA-Z0-9]+$/&qu ...
- 不绑架输入--document.getElementById("linkage_"+id_type+"_echo").value="";--联动
<script> function w_linkage(id_type) { var selected = $("#linkage_"+id_type+"_t ...
- Running Kafka At Scale
https://engineering.linkedin.com/kafka/running-kafka-scale If data is the lifeblood of high technolo ...
- ucenter小结
经历了一天的折腾,大概搞清楚的ucenter接入应用的方法.总结如下: 一.下载安装ucenter.这个很简单. 二.然后就是接入应用. 1.先在你项目的根目录copy一份uc_client文件夹. ...
- JAVA Callable
Listing -. Calculating Euler’s Number e import java.math.BigDecimal; import java.math.MathContext; i ...