connect设置超时的方法
在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式socket,如果服务器当前不可用,则connect会等待知道超时时间到达,而这个超时时间是系统内核规定的,并不能使用setSocketOpt来设置,这个函数只能设置send和recv的超时,为了能够随意控制connect的超时时间,可以使用select。大致的过程就是先将socket设置成非阻塞,使用select去轮询套接口,再根据套接口去判断连接状态。
int connectServer(int sock_fd,unsigned int port,char* ip)
{
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_aton(ip, &servaddr.sin_addr ); fcntl(sock_fd,F_SETFL,fcntl(sock_fd,F_GETFL,0)|O_NONBLOCK);
int connected = connect(sock_fd, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
int ret = -1;
if (connected != 0 )
{
if(errno != EINPROGRESS)
printf("connect error :%s\n",strerror(errno));
else
{
struct timeval tm = {2, 0};
fd_set wset,rset;
FD_ZERO(&wset);
FD_ZERO(&rset);
FD_SET(sock_fd,&wset);
FD_SET(sock_fd,&rset);
long t1 = time(NULL);
int res = select(sock_fd+1,&rset,&wset,NULL,&tm);
long t2 = time(NULL);
printf("interval time: %ld\n", t2 - t1);
if(res < 0)
{
printf("network error in connect\n");
}
else if(res == 0)
{
printf("connect time out\n");
}
else if (1 == res)
{
if(FD_ISSET(sock_fd,&wset))
{
printf("connect succeed.\n");
fcntl(sock_fd,F_SETFL,fcntl(sock_fd,F_GETFL,0) & ~O_NONBLOCK);
ret = 0;
}
else
{
printf("other error when select:%s\n",strerror(errno));
}
}
}
} return ret;
}
程序先把socket设置成非阻塞,connect在非阻塞模式下会立刻返回,如果没有其他错误,返回值等于0。当connect不能立刻建立连接时,会返回一个EINPROGRESS,表示连接正在建立的过程中,这时我们可以使用select去轮询套接口,而select的轮询超时时间可以根据自己的需要去设置,最主要的是轮询的集合一定要是读和写的集合,即select的第二和第三个参数要赋值,待select返回就可以去判断返回值来确定connect的进程状态了。如果返回值小于0,说明connect的进程出现了错误,如果是等于0则说明connect超时,如果等于1,并且套接口此时的状态是可写,则说明了connect已经成功建立(关于这点大概是因为服务器接收了连接后,不会立刻想socket写数据,这是客户端就只能轮询到可写的socket,我觉得如果服务器接受连接并立刻写数据,在客户端就可能是返回2,这时学要同时判断socket的可读和可写了);其他情况的话就算是其他错误吧,至此,我们只需要设置select的超时值就可以随心所欲地实现自己想要的connect连接超时了。
最后,别忘了把套接口设置会阻塞状态,毕竟阻塞状态加线程方便控制。
https://blog.csdn.net/codeheng/article/details/44625495
connect设置超时的方法的更多相关文章
- accpet和connect设置超时
三次握手 TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户 ...
- PHP file_get_contents设置超时处理方法
从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_c ...
- 为tcp的connect设置超时时间
struct timeval tv = {timeout, 0}; 27 setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(s ...
- 使用SIGALARM为connect设置超时
static void connect_alarm(int); int connect_timeo(int sockfd, const SA *saptr, socklen_t salen, int ...
- 服务器编程入门(13) Linux套接字设置超时的三种方法
摘要: 本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...
- Unix网络编程 高级IO套接字设置超时
我们知道.对于一个套接字的读写(read/write)操作默认是堵塞的.假设当前套接字还不可读/写,那么这个操作会一直堵塞下去,这样对于一个须要高性能的server来说,是不能接受的.所以,我们能够在 ...
- connect调用超时的实现方式
第二种更通用的.使connect调用超时的方法是使套接字成为无阻塞的,然后用select等待它完成.这种方法避免了使用alarm时遇到的很多问题,但我们必须承认,即使是在UNIX实现中,这种方法还是存 ...
- Resttemplate中设置超时时长方法
为了满足调用需求,需要在使用Resttemplate发送请求时,修改超时时长,网上给出了相关修改方法,代码如下: HttpComponentsClientHttpRequestFactory rf = ...
- HttpClient库设置超时
HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...
随机推荐
- java操作redis。jedis使用api
package com.wujintao.redis; import java.util.Date; import java.util.HashMap; import java.util.Iterat ...
- 替代crontab,任务计划统一集中管理系统cronsun简介
一.背景 crontab 是 Linux 系统里面最简单易用的定时任务管理工具,相信绝大多数开发和运维都用到过.在咱们公司,很多业务系统的定时任务都是通过 crontab 来定义的,时间长了后会发现存 ...
- 训练深度学习网络时候,出现Nan 或者 震荡
出现Nan : 说法1: 说法2:说法3: 震荡 : 分析原因: 1:训练的batch_size太小 1. 当数据量足够大的时候可以适当的减小batch_size,由于数据量太大,内存不够 ...
- rational rose 2003完整汉化版 win7版
下载链接:https://pan.baidu.com/s/1InpgNS_1-Rigw4fE3OX1Eg 软件介绍 Rational Rose 2003破解版是一款基于UML的可视化建模工具.可用于软 ...
- 频分复用(Frequency Division Multiplexer)
作者:桂. 时间:2017年12月19日20:43:04 链接:http://www.cnblogs.com/xingshansi/p/8067839.html 前言 主要记录基本的频分复用原理,以及 ...
- git从ssh到提交到github
1.安装 Git 客户端 yum install git 2.打开 Git Bash,开始键入用户信息,和github通讯用的,不能乱写: git config --global user.name ...
- 分享:Oracle 系统变量函数用法说明
在Oracle数据库中,Oracle系统变量函数是经常会使用到的函数,分享下Oracle系统变量函数的用法. Oracle函数多种多样,系统变量函数就是其中之一,介绍三种最常见的系统变量函数. Ora ...
- Atitti 住房部建设指南
Atitti 住房部建设指南 1. 住房部建设的重要意义2 2. 房屋选址::首要核心要素,环境环境环境!!!2 2.1. 价格要素与地段..2 2.2. 与工作地距离,一般是半小时到一个半小时为好3 ...
- [svc]nginx限制客户端上传附件的大小
300 行 python 代码的轻量级 HTTPServer 实现文件上传下载 系统环境 [root@n1 conf]# cat /etc/redhat-release CentOS Linux re ...
- 【Unity】3.6 导入图片资源
分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 Unity支持的图像文件格式非常多,包括TIF.PSD.TCA.JPC.PNG.GlF.BMP.IFF.PICT.DDS ...