TCP连接异常断开的检测
2010-10-19 11:28
591 查看
作者:曾宏安,华清远见嵌入式学院讲师。
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”);
exit(-1);
}
if (setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepintvl, sizeof (keepintvl) < 0)
{
perror(“fail to set SO_KEEPINTVL”);
exit(-1);
}
if (setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepcnt, sizeof (keepcnt) < 0)
{
perror(“fail to set SO_KEEPALIVE”);
exit(-1);
}
一旦打开KEEPALIVE探测,当TCP连接异常断开后,对sockfd进行recv操作会返回-1,并且errno的值为ETIMEDOUT。
这样一来就可以很方便的在应用程序中检测TCP连接的情况,如果检测到异常断开最简单的处理就是关闭连接。
如果您喜欢这篇文章,可以加华清远见老师为好友,单击以下链接即可:
http://student.csdn.net/invite.php?u=45153&c=8af704eb3cd8e773
(作者:华清远见嵌入式培训中心 www.embedu.org www.farsight.com.cn )
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”);
exit(-1);
}
if (setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepintvl, sizeof (keepintvl) < 0)
{
perror(“fail to set SO_KEEPINTVL”);
exit(-1);
}
if (setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepcnt, sizeof (keepcnt) < 0)
{
perror(“fail to set SO_KEEPALIVE”);
exit(-1);
}
一旦打开KEEPALIVE探测,当TCP连接异常断开后,对sockfd进行recv操作会返回-1,并且errno的值为ETIMEDOUT。
这样一来就可以很方便的在应用程序中检测TCP连接的情况,如果检测到异常断开最简单的处理就是关闭连接。
如果您喜欢这篇文章,可以加华清远见老师为好友,单击以下链接即可:
http://student.csdn.net/invite.php?u=45153&c=8af704eb3cd8e773
(作者:华清远见嵌入式培训中心 www.embedu.org www.farsight.com.cn )
相关文章推荐
- TCP连接异常断开检测
- NDK-TCP连接异常断开检测
- (转)TCP连接异常断开检测
- TCP连接异常断开检测
- (转)TCP连接异常断开检测
- TCP连接异常断开检测
- TCP连接异常断开的检测
- Linux检测TCP连接断开的一种简单实现方法
- tcp/ip的连接断开不被检测到的鬼异现象
- socket选项自带的TCP异常断开检测
- socket选项自带的TCP异常断开检测
- falcon 监控 windows tcp连接异常断开
- 优雅地关闭Socket;检测非正常断开的TCP连接
- TCP连接中的异常断开情况处理
- 针对TCP连接异常断开的分析
- TCP 连接异常状态检测
- 检测TCP非正常断开连接 SO_KEEPALIVE 使用缺陷分析
- 用select检测对方断开tcp连接
- 怎样及时检测出非正常断开的TCP连接
- tcp/ip的连接断开不被检测到的鬼异现象