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方式,那么路径对不 ...
随机推荐
- Asp.Net 常用代码-备用
1.DropDownList 复制 //DropDownList DropDownList2.Items.Clear(); foreach (ListItem li in DropDownList1. ...
- 新建childTest文件夹,里面依然放进我们需要的.py文件即可
一.模块 我们编写文件:a.py,放在C:\Python34\Lib\sit-packages下,里面写上一句代码为: print('this is a') 之后我们就可以在我们的代码里面引用a.py ...
- 【iCore2模块】VGA模块样板谍照!
基于 iCore2 双核心板的 VGA模块样机做出来好久了,经过一个多月的努力奋战,该模块的代码已经写完,硬件也测试完毕,性能很好.下面贴几张图: 照片一: 为了节约时间,打样用的是绿色的板子,不过批 ...
- c#String的不变特性,可读但不可写性
谈到字符串,大家自然觉得简单,但是总是有一些小的问题隐约出现,下面我就系统的说一下字符串的问题,有说不到日后再予补充. 1,首先String是一个类,string只是String类的一个别名,别名的意 ...
- [办公应用]我的WORD文档表格操作不灵活 无法调整列宽
最近同事的一个word文档中的表格操作非常不灵活,用鼠标直接调整列宽时总觉得很不灵活.她的操作系统为XP,office 为微软office 2003. 我首先检查了木马,检查了输入法等,结果都没有问题 ...
- Redis 笔记与总结3 list 类型
redis 版本 [root@localhost ~]# redis-server --version Redis server v= sha=: malloc=jemalloc- bits= bui ...
- artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
/*! artDialog v6.0.2 | https://github.com/aui/artDialog */ 将页面某一隐藏的 div 的 html 内容传到 artdialog 的弹窗中,并 ...
- 获取在attr.xml中声明的主题样式
在换肤时,先在attr.xml中定义Resource的属性名,再到stytle中,根据不同的主题,给属性赋值. 在布局文件中可直接以 android:background="?attr/a ...
- markdown 书写表格
Tables Are Cool col 3 is right-aligned $1600 col 2 is centered $12 zebra stripes are neat $1 Refs ma ...
- rgb转灰度 RGB To Gray php Adobe RGB (1998) [gamma=2.20]
<?php /** * Date: 2016/10/24 * Time: 0:52 */ // Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * ...