`
Michaelmatrix
  • 浏览: 209521 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

怎样及时检测出非正常断开的TCP连接(转)

 
阅读更多
此处的”非正常断开”指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连接,有实现代码

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

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

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

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

    代码客: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

    应确保连接成功(可运行 adb devices 看是否能列出该设备)。 让设备在 5555 端口监听 TCP/IP 连接: adb tcpip 5555 断开 USB 连接。 找到设备的 IP 地址。 一般能在「设置」-「关于手机」-「状态信息」-「IP...

    mysql数据库my.cnf配置文件

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

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

    (本书由4部分组成,需下载完4个文件之后,放在同一文件目录下才能正常解压) 基本信息  作者:(美国)(William R.Stanek)斯坦里克 译者:贾洪峰  出版社:清华大学出版社  页码:583 页  出版日期:2009年  ISBN:...

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

    (本书由4部分组成,需下载完4个文件之后,放在同一文件目录下才能正常解压) 基本信息  作者:(美国)(William R.Stanek)斯坦里克 译者:贾洪峰  出版社:清华大学出版社  页码:583 页  出版日期:2009年  ISBN:...

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

    (本书由4部分组成,需下载完4个文件之后,放在同一文件目录下才能正常解压) 基本信息  作者:(美国)(William R.Stanek)斯坦里克 译者:贾洪峰  出版社:清华大学出版社  页码:583 页  出版日期:2009年  ISBN:...

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

    (本书由4部分组成,需下载完4个文件之后,放在同一文件目录下才能正常解压) 基本信息  作者:(美国)(William R.Stanek)斯坦里克 译者:贾洪峰  出版社:清华大学出版社  页码:583 页  出版日期:2009年  ISBN:...

    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. 警告:现在系统处在...

    Oracle9i的init.ora参数中文说明

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

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

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

Global site tag (gtag.js) - Google Analytics