TCP连接异常断开检测
2016-04-28 11:13
627 查看
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现。某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接。下面介绍一种方法来检测这种异常断开的情况
1) 在TCP协议中提供了KEEPALIVE检测。该选项使能后,在一个TCP连接上,若指定的一段时间内没有数据交换,则自动发送分节等待对方确认。
SO_KEEPALIVE : 该选项设置是否打开探测
TCP_KEEPIDLE : 开始发送探测分节前等待的空闲时间
TCP_KEEPINTVL: 两次发送探测分节的时间间隔
TCP_KEEPCNT: 判定断开前发送探测分节的次数
2) 设定探测相关选项值
int keepalive = 1; // 打开探测
int keepidle = 60; // 开始探测前的空闲等待时间
int keepintvl = 10; // 发送探测分节的时间间隔
int keepcnt = 3; // 发送探测分节的次数
3) 设置套接字的属性
if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof (keepalive) < 0)
{
perror(“fail to set SO_KEEPALIVE”);
exit(-1);
}
if (setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void *) &keepidle, sizeof (keepidle) < 0)
{
perror(“fail to set SO_KEEPIDLE”);
1) 在TCP协议中提供了KEEPALIVE检测。该选项使能后,在一个TCP连接上,若指定的一段时间内没有数据交换,则自动发送分节等待对方确认。
SO_KEEPALIVE : 该选项设置是否打开探测
TCP_KEEPIDLE : 开始发送探测分节前等待的空闲时间
TCP_KEEPINTVL: 两次发送探测分节的时间间隔
TCP_KEEPCNT: 判定断开前发送探测分节的次数
2) 设定探测相关选项值
int keepalive = 1; // 打开探测
int keepidle = 60; // 开始探测前的空闲等待时间
int keepintvl = 10; // 发送探测分节的时间间隔
int keepcnt = 3; // 发送探测分节的次数
3) 设置套接字的属性
if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof (keepalive) < 0)
{
perror(“fail to set SO_KEEPALIVE”);
exit(-1);
}
if (setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void *) &keepidle, sizeof (keepidle) < 0)
{
perror(“fail to set SO_KEEPIDLE”);
相关文章推荐
- 基于Windows Socket 的网络通信中的心跳机制原理
- JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- java http get post 各种请求,模拟浏览器请求
- 网络封包分析工具Charles使用
- IIS-网站发布之后访问HTTP 错误 403.14 - Forbidden
- Android的三种网络通信方式
- Android中网络编程以及与服务器上Web项目的基础交互
- java 505异常,原因http协议参数间不能为空
- Android网络请求库okHttp进行post、get请求
- 理解HTTP协议中的"Transfer-Encoding: chunked"
- Python 与 网络爬虫
- centos7最小安装后网络配置
- 网络流初步
- Linux下C语言实现TCP通信
- 基于空间金字塔池化的卷积神经网络物体检测
- 教你快速认识HTTP状态码
- CloseableHttpClient类与HttpClients类解析
- 【通用技术】实时网络响应要求的移动端App的网络超时设定
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
- 理解HTTP幂等性