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

转载 2006年06月04日 03:25: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. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法...
  • lsfa1234
  • lsfa1234
  • 2011年03月04日 14:32
  • 1636

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

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

长期使人困惑的问题:TCP连接中断的实时检测

目前TCP/IP已经成为网络的主导技术。通过对TCP底层实现的分析,对TCP/IP编程中一个长期使人困惑的问题----网络连接中断的实时检测—进行深入的分析,并提出相应的解决方案。      0引...
  • a511244213
  • a511244213
  • 2016年03月24日 17:29
  • 2745

浅谈TCP/IP 三次握手建立连接,四次握手断开连接,以及关于非阻塞socket重连问题

1.最近在做一个项目,需要和一个嵌入式服务器打交道,该设备其实是个编码器,负责将摄像头采集到的视频数据进行编码然后再在某些特定的端口中推送流到客户端,而我的工作是将该这些流推送出来后然后进行按特定的协...
  • m370980295
  • m370980295
  • 2016年01月10日 12:47
  • 1535

检查非正常断开的tcp连接

所以我已一个一般的嵌入式web服务器boa为原形进行了从写,专门适应嵌入式web服务器这种需要。 服务器这种需要。 为什么选用boa? 实际上我参考了很多web服务器的代码和构架,嵌入式应用...
  • xiongping_
  • xiongping_
  • 2015年05月25日 09:34
  • 693

socket 网线断开判断

最近自己再设计一款电视上墙,在rtsp 自动重连时候突然拔掉网线陷入死锁状态,后来用tcpview 查看 tcp socket 连接保持 ESTABLISH 状态不变,而且wsawaitformult...
  • ww506772362
  • ww506772362
  • 2014年12月14日 23:46
  • 1027

检测非正常断开的TCP连接

此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因。 有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAl...
  • zsf8701
  • zsf8701
  • 2013年03月27日 10:23
  • 1490

Hough变换检测直线和圆

1 直线是如何表示的?        对于平面中的一条直线,在直角坐标系中,常见的有点斜式,两点式两种表示方法。然而在hough变换中,考虑的是另外一种表示方式:使用极坐标(r,theta)来表示一...
  • caoluwill
  • caoluwill
  • 2016年07月18日 10:23
  • 541

TCP异常断开检测

是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接。下面介绍一种方法来检测这种异常断开的情况 1) 在TCP协议中提供了KEEPALIVE检测。该选项使能后,在一个TCP连接...
  • j6915819
  • j6915819
  • 2014年10月23日 15:12
  • 1392

TCP建立连接和断开连接流程

一、基本描述TCP协议为提供面向连接的服务,需要先建立连接,然后才可以通信,通信结束时,需要断开连接。二、建立连接流程建立连接的过程也叫做三次握手,流程如下:1、首先,一定是由客户端发起连接请求,服务...
  • gamekit
  • gamekit
  • 2016年12月26日 19:32
  • 1703
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样及时检测出非正常断开的TCP连接(zz)
举报原因:
原因补充:

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