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

转载 2006年06月12日 18:47:00

作者:在水一鱼(powercc@21cn.com)

此处的”非正常断开”指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连接

Tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为:a. 连接的对端正常关闭.b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法...
  • ProgBelief
  • ProgBelief
  • 2011年01月18日 16:54
  • 8196

优雅地关闭Socket;检测非正常断开的TCP连接

----------------------------------------------------------------------------------------------------...
  • fangyi86
  • fangyi86
  • 2010年10月25日 23:19
  • 11787

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

作者:在水一鱼(powercc@21cn.com)此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因有两种方法可以检测:1.TCP连接双方定时发握...
  • freexploit
  • freexploit
  • 2006年06月12日 18:47
  • 1942

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

 作者:在水一鱼(powercc@21cn.com) 此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因 有两种方法可以检测:1.TCP...
  • cuijinquan
  • cuijinquan
  • 2014年01月22日 14:38
  • 414

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

作者:在水一鱼(powercc@21cn.com)此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因有两种方法可以检测:1.TCP连接双方定时发握...
  • afxid
  • afxid
  • 2006年06月04日 03:25
  • 1963

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

  • 2010年09月19日 15:45
  • 29KB
  • 下载

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

Tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为:a. 连接的对端正常关闭.b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法...
  • lsfa1234
  • lsfa1234
  • 2011年03月04日 14:32
  • 1646

tcp长连接判断对方断开的方法

1、心跳包 2、keepalive检测,对于设置了keepalive来说,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socke...
  • ztsinghua
  • ztsinghua
  • 2016年04月10日 21:59
  • 868

如果网络出现异常,TCP连接中断,那么计算机要多久才能够检测出来呢?

如果网络出现异常,TCP连接中断,那么计算机要多久才能够检测出来呢? 最佳答案 这个问题得分情况来说: 1、双方只建立了一个连接,然后就再也没有任何数据通信,这完全是可能的。这时,t...
  • lsfa1234
  • lsfa1234
  • 2011年03月04日 14:00
  • 4683

自动检测SOCKET链接断开

如何判断SOCKET已经断开 最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在server端会使用专门的线程处理一...
  • rethyx
  • rethyx
  • 2014年02月26日 14:52
  • 1405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样及时检测出非正常断开的TCP连接
举报原因:
原因补充:

(最多只允许输入30个字)