accpet和connect设置超时
三次握手
TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户端收到ack+sync后,返回一个ack,connect返回,服务端收到ack后,accept返回,如下图所示:

connect超时设置
如果connect连接的服务端不存在,或是异常了,会出现什么情况,可能有以下几种情况:
服务端返回连接错误
等待系统默认的75秒超时
上述两种情况都是不可控的,因此可以通过设置超时时间的方式控制超时时间,有下述两种方法。
非阻塞connect+select
将conenct设置成非阻塞后,connect在发送sync后直接返回-1,然后使用select等待ack+sync,select是可以设置超时时间,因此达到设置超时时间的目的。注意需要将socket恢复成阻塞模式,如下所示:
dwSign = ;
if((err = ioctl(socket, FIONBIO, &dwSign)) < )
{
printf("ioctl socket failed, errno = %d!\n", err);
close(socket);
return err;
} SOCKADDR_IN tServerAddrInfo = {};
tServerAddrInfo.sin_family = AF_INET;
tServerAddrInfo.sin_addr.s_addr = ServerIP;
tServerAddrInfo.sin_port = ServerPort;
int bRet = 0x0;
fd_set set = {0x0};
if(- == connect(socket, (SOCKADDR*)&tServerAddrInfo, sizeof(SOCKADDR)))
{
tm.tv_sec = ;
tm.tv_usec = ;
FD_ZERO(&set);
FD_SET(socket, &set); // select返回值大于0,表示有数据可以操作;select返回值等于0,表示超时
if(select(socket + , NULL, &set, NULL, &tm) > )
{
// 获取socket的error值,0表示成功
getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == )
{
bRet = TRUE;
}
else
{
bRet = FALSE;
}
}
else
{
bRet = FALSE;
}
}
else
{
bRet = TRUE;
} dwSign = ;
if( > (err = ioctl(socket, FIONBIO, &dwSign)))
{
printf("ioctl socket failed, errno = %d!\n", err);
close(dwSocket);
return err;
}
设置socket的发送超时时间
调用connect函数实际上是发送sync报文,如果设置发送超时时间,那么也就可以实现connect的超时时间,如下所示:
struct timeval timeout = {, );
setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(struct timeval));
accpet超时设置
既然可以通过设置发送超时时间,控制connect的超时时间,那么同理,也可以通过设置接收超时时间来设置accept的超时时间,如下所示:
struct timeval timeout = {, };
setsockopt(proxy_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
accpet和connect设置超时的更多相关文章
- connect设置超时的方法
在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式socket,如果服务器当前不可用,则connect会等待知道超时时间到达,而这个超时时间是系统内核规定的,并不能使用setSo ...
- 为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来说,是不能接受的.所以,我们能够在 ...
- 使用SIGALRM信号为阻塞操作设置超时
我们经常会遇到为阻塞操作设置超时的问题,比如说阻塞套接字read读取设置10秒超时,其中一个办法就是调用alarm函数,它在指定超时时期产生SIGALRM信号,使得阻塞操作中断. 但其弊端在于: 1. ...
- HttpClient库设置超时
HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...
- httpClient创建对象、设置超时
从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...
- 测试setsockopt设置超时是否生效代码
// 测试setsockopt设置超时是否生效代码 #include <arpa/inet.h> #include <netinet/in.h> #include <st ...
随机推荐
- 第三章:软件也要拼脸蛋-UI 开发的点点滴滴
常用控件 常用控件有:按钮 Button.文本显示框 TextView.图片显示框 ImageView.文本编辑框 EditText.进度条 ProgressBar.提示框 AlertDialog.进 ...
- idea的maven项目无法引入junit类
本机:java版本:1.8 pom中是junit版本:4.12 出现问题:在使用@Test 无法引入 : org.junit.Test; 解决方法:junit在pom.xml改为 4.12-beta- ...
- SpringBoot项目jar包启动脚本
startup.bat @echo off set path=X:\xxxxxxx\Java\JDK\jre\bin START "项目名" "%path%\java&q ...
- Python 简明教程 --- 4,Python 变量与基本数据类型
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 任何一个人都会写出能够让机器理解的代码,只有好的程序员才能写出人类可以理解的代码. -- Marti ...
- Python实用笔记 (17)模块
一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块. 现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲 ...
- Android studio 使用夜神模拟器
首先参考这个:http://blog.csdn.net/jssongwei/article/details/50771441 然后我发现就是一个端口问题
- Oracle 11g各种服务作用以及哪些需要开启
Windwos server 2012 R2上成功安装Oracle 11g后共有7个服务,如果全局数据库名为orcl,则Oracle服务分别为 Oracle ORCL VSSWriter Servic ...
- 浅谈MySQL多表操作
字段操作 create table tf1( id int primary key auto_increment, x int, y int ); # 修改 alter table tf1 modif ...
- 洛谷 P1347 【排序】
这篇题解没有用拓补排序 (嗐 菜就直说) 个人感觉这道题拓补排序没有变种\(Floyd\)好写吧,思维难度也低一点(亲眼目睹机房dalao这道题拓补排序调了很久). 吐槽结束,开始正题~ 对于这道题为 ...
- 打造属于你的聊天室(WebSocket)
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...