`
zhangyafei_kimi
  • 浏览: 262474 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

TCP连接非正常断开的检测

阅读更多
如果主机崩溃,write是否阻塞取决于内核的tcp缓冲区,但read将一直阻塞,直到超时ETIMEOUT,或由于某些中间路由器的原因返回EHOSTUNREACH/ENETUNREACH。select不能检测到该情况。
如果主机崩溃并重起,客户的write到达主机时主机响应RST,客户的read将返ECONNRESET。





此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因
有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测
第二种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测,所以本文只讲第二种方法在Linux,Window2000下的实现(在其它的平台上没有作进一步的测试)
Windows 2000平台下
//定义结构及宏
struct TCP_KEEPALIVE {
u_longonoff;
u_longkeepalivetime;
u_longkeepaliveinterval;
} ;
#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)
//KeepAlive实现
TCP_KEEPALIVE inKeepAlive = {0}; //输入参数
unsigned long ulInLen = sizeof(TCP_KEEPALIVE);
TCP_KEEPALIVE outKeepAlive = {0}; //输出参数
unsigned long ulOutLen = sizeof(TCP_KEEPALIVE);
unsigned long ulBytesReturn = 0;
//设置socket的keep alive为5秒,并且发送次数为3次
inKeepAlive.onoff = 1;
inKeepAlive.keepaliveinterval = 5000; //两次KeepAlive探测间的时间间隔
inKeepAlive.keepalivetime = 5000; //开始首次KeepAlive探测前的TCP空闭时间
if (WSAIoctl((unsigned int)s, SIO_KEEPALIVE_VALS,
(LPVOID)&inKeepAlive, ulInLen,
(LPVOID)&outKeepAlive, ulOutLen,
&ulBytesReturn, NULL, NULL) == SOCKET_ERROR)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) \WSAIoctl failed. error code(%d)!\n"),WSAGetLastError()));
}


Linux平台下
#include
……
////KeepAlive实现
//下面代码要求有ACE,如果没有包含ACE,则请把用到的ACE函数改成linux相应的接口
int keepAlive = 1;//设定KeepAlive
int keepIdle = 5;//开始首次KeepAlive探测前的TCP空闭时间
int keepInterval = 5;//两次KeepAlive探测间的时间间隔
int keepCount = 3;//判定断开前的KeepAlive探测次数
if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!\n")));
}
if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!\n")));
}
if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!\n")));
}
if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!\n")));
}
分享到:
评论

相关推荐

    怎样及时检测出非正常断开的TCP连接.DOC

    怎样及时检测出非正常断开的TCP连接,有实现代码

    p124 - p163 TCP三次握手 四次挥手原理解析

    控制位包括 ACK、RST、SYN、FIN 等,ACK 表示确认应答的字段变为有效,RST 表示 TCP 连接中出现异常必须强制断开连接,SYN 表示希望建立连接,并在其“序列号”的字段进行序列号初始值的设定,FIN 表示今后不会再有...

    通信与网络中的串口服务器RS232和485转以太网模块的选购技巧

     当把串口服务器设置为TCP server时,串口服务器接受了连接请求后建立了TCP连接,一旦网络非法断开或者服务器非正常关机,串口服务器就一直认为TCP连接还在建立中,就一直不释放之前的连接,就不能接受新的连接。...

    代码客:G-TcpServer(IOCP) 1.0 正式版及Demo源码

    但实际应用中,正常情况下连接率远少于1万/S,尤其是长连接的服务器,即使是短连接的服务器也不会发生这样的连接率。可能的情况是DOS,如果是影响也不大,因为还有MaxConnection控制,超过这个数的连接就立即被Close...

    代码客:Iocp Tcp Server(G-TcpServer) 1.0 Demo源码

    但实际应用中,正常情况下连接率远少于1万/S,尤其是长连接的服务器,即使是短连接的服务器也不会发生这样的连接率。可能的情况是DOS,如果是影响也不大,因为还有MaxConnection控制,超过这个数的连接就立即被Close...

    Borland Socket Server Fix2.0 D7

    2、加入心跳包,避免出现客户端非正常断开后,服务器为其开辟的内存没有释放而被长期占用,最终导致内存不足(通常会出现"out of memory"的出错信息)。 3、在调试程序时,发现清除该客户端TCP连接时有异常,不知为...

    adb1.0.26包含fastboot.exe

    通过 USB 连接来正常使用 adb 需要保证几点: 硬件状态正常。 包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。 Android 设备的开发者选项和 USB 调试模式已开启。 可以到「设置」-「开发者选项...

    ITE第六章考试答案.docx

    答案是检查所有电缆是否存在损坏、更换电缆上的所有标签、断开并重新连接所有插线电缆、更换所有电缆支架以防连接点松脱。 其它 某设备列出的 IPv6 地址为 2001:0DB8:75a3:0214:0607:1234:aa10:ba01,该设备的什么...

    mysql数据库my.cnf配置文件

    # 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 #skip-networking back_log = 600 # MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用, # ...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     5.7.3 检测修复死锁和阻塞连接 125  5.7.4 在SQL Server中跟踪命令的执行 126  5.7.5 终止服务器进程 127  第6章 使用SQL Server Management Studio配置SQL Server 128  6.1 使用SQL Server Management Studio...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     5.7.3 检测修复死锁和阻塞连接 125  5.7.4 在SQL Server中跟踪命令的执行 126  5.7.5 终止服务器进程 127  第6章 使用SQL Server Management Studio配置SQL Server 128  6.1 使用SQL Server Management Studio...

    SQL.Server.2008管理员必备指南.part3.rar(3/4)

     5.7.3 检测修复死锁和阻塞连接 125  5.7.4 在SQL Server中跟踪命令的执行 126  5.7.5 终止服务器进程 127  第6章 使用SQL Server Management Studio配置SQL Server 128  6.1 使用SQL Server Management Studio...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     5.7.3 检测修复死锁和阻塞连接 125  5.7.4 在SQL Server中跟踪命令的执行 126  5.7.5 终止服务器进程 127  第6章 使用SQL Server Management Studio配置SQL Server 128  6.1 使用SQL Server Management Studio...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    5.7.3 检测修复死锁和阻塞连接 5.7.4 在SQL Server中跟踪命令的执行 5.7.5 终止服务器进程 第6章 使用SQL Server Management Studio配置SQL Server 6.1 使用SQL Server Management Studio管理配置 6.2 确定系统和...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    5.7.3 检测修复死锁和阻塞连接 5.7.4 在SQL Server中跟踪命令的执行 5.7.5 终止服务器进程 第6章 使用SQL Server Management Studio配置SQL Server 6.1 使用SQL Server Management Studio管理配置 6.2 确定系统和...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    5.7.3 检测修复死锁和阻塞连接 5.7.4 在SQL Server中跟踪命令的执行 5.7.5 终止服务器进程 第6章 使用SQL Server Management Studio配置SQL Server 6.1 使用SQL Server Management Studio管理配置 6.2 确定系统和...

    计算机应用技术(实用手册)

    IDE 1号接口检测到光驱,IDE 2号接口检测到希捷硬盘为80GB,其它为NONE表示检测没有设备连接到接口上。 Warning!! Now system is in safe mode. Please re-setting CPU frequency in CMOS setup. 警告:现在系统处在...

    梯控系统的解决方案设计.doc

    当发生紧急状况或者IC电梯系统损坏时,只要断开IC卡电梯系统的供电,管理继电器恢 复到原来状态,此时能保证电梯原来系统的正常运行。 设备供电要求: 电源位于轿顶电气箱,规格为AC220V。 预留设备安装空间要求: ...

    Oracle9i的init.ora参数中文说明

    正常情况下, WHERE 子句中进行的比较是二进制的, 但语言比较则需要 NLSSORT 函数。可以使用 NLS_COMP 指定必须根据NLS_SORT 会话参数进行语言比较。 值范围: Oracle8i National Language Support Guide 中指定的...

Global site tag (gtag.js) - Google Analytics