`
anders0913
  • 浏览: 90653 次
  • 性别: 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平台
//定义结构及宏
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")));
}



:-)

分享到:
评论
1 楼 zzsczz 2009-09-23  
双方定时发握手消息 更可靠。。。。。。

相关推荐

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

    在 Linux 和 Windows 2000 平台下,可以使用两种方法来检测非正常断开的 TCP 连接:1. 双方定时发送握手消息;2. 使用 TCP 协议栈中的 KeepAlive 探测。第二种方法简单可靠,只需对 TCP 连接的两个 Socket 设定 ...

    Quectel-BC260Y-CN-TCP(IP)-应用指导-V1.0

    公司对非正常操作导致的损失不承担责任。 6. **版权声明** 该文档的所有权归上海移远通信技术股份有限公司所有,未经授权的复制和传播将承担法律责任。 7. **修订记录** 文档的每次更新都会记录在修订历史中,以...

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

    HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦...

    TCP-chat-online-server.rar_tcp_tcp server

    在IT领域,网络通信是至关重要的部分,而TCP(传输控制协议)作为互联网协议栈中的核心组件,扮演着数据可靠传输的重要角色。本项目“TCP-chat-online-server.rar”旨在通过TCP协议实现一个简单的局域网聊天服务器,...

    关于TCP心跳检测共2页.pdf.zip

    - 优点:及时发现并恢复非正常断开的连接,防止资源浪费。 - 缺点:增加网络负载,特别是在高并发的服务器上可能会产生大量无效的心跳包。 6. **应用层心跳** - 除了TCP内置的心跳机制,许多应用程序还实现自己...

    TCP端口的高级扫描方法及实现

    ### TCP端口的高级扫描方法及其实现 #### 1. 引言 随着网络技术的发展,网络安全成为了人们关注的重点之一。了解网络设备和服务的状态对于维护网络安全至关重要。端口扫描作为一种有效的工具,可以帮助管理员了解...

    Python-tcpkiller用于在Linux或macOS上关闭一个TCP连接

    tcp_killer工具是这个领域的实践应用,它为系统管理员和开发者提供了一种便捷的方法来处理棘手的网络连接问题,比如强制结束占用端口的进程或者测试网络服务的恢复能力。 该工具的核心原理在于使用socket的RAW模式...

    WinEggDrop-Kill-TCP.rar_WinEggDrop_kill tcp

    TCP保证了数据包的顺序传输和错误检测,但有时由于某些原因,我们可能需要主动断开系统中的TCP连接,例如测试网络环境、解决连接问题或者安全需求等。WinEggDrop Kill TCP功能就是为了解决这样的需求。 这个功能...

    incubator_labview_TCP断线重连_tcp通信

    同时,考虑使用非阻塞模式的TCP通信,以允许LabVIEW在等待数据时执行其他任务。 7. **实例应用**: "incubator_labview_TCP断线重连_tcp通信"可能是指在一个实验室环境中,使用LabVIEW控制和监控孵化器设备。TCP...

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

    HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦...

    判断Socket是否断开的小代码

    - 使用`ClientSocket.Poll`方法检测Socket是否可读,进而判断连接是否正常。 2. **Socket数据接收**: - 创建适当大小的缓冲区来存储接收到的数据。 - 通过`ClientSocket.Receive`方法读取数据到缓冲区。 - ...

    QTcpSocket通信编程时阻塞与非阻塞的问题 - findumars - 博客园1

    QTcpSocket是Qt库中的一个类,用于处理TCP(传输控制协议)套接字通信。在QTcpSocket的编程中,我们经常会遇到阻塞和非阻塞两种模式的选择。这两种模式在处理网络通信时有着不同的行为和应用场景。 首先,阻塞模式...

    TCP&UDP;测试工具

    例如,当用户报告网络问题时,管理员可以使用TCP&UDP测试工具来定位问题,如检查网络连接是否畅通,确定是否存在丢包现象,或者分析TCP的拥塞窗口大小是否正常。 在实际使用中,"TCP&UDP测试工具"可能包含一个图形...

    boost的tcp服务器

    在本项目中,我们关注的是使用Boost库构建一个TCP服务器,这个服务器具有处理多并发连接和心跳检测的能力。这样的设计是为了确保服务器能够稳定地为多个客户端提供服务,并通过心跳检测机制来检测并清理失效的连接。...

    TCP_UDP_TEST.rar_tcp 安卓_安卓_安卓 tcp_安卓系统_手机tcp测试

    对于非专业人员,它也可以用来诊断网络连接问题,比如检查设备是否可以正常打开特定端口,或者验证网络环境中的丢包情况。 总的来说,"TCP_UDP_TEST.rar"提供了一种便捷的方式来测试手机上的TCP和UDP网络连接,无论...

    网络攻防的艺术 tcp

    - **正常断开连接**:通过四次挥手来完成连接的断开。 - **异常断开连接**: - 如果客户端或服务器端收到RST包,则立即断开连接,并清除缓冲区中的数据。 - 另一种情况是客户端或服务器端发送SYN包来尝试重新建立...

    STM32 tcp/ip通讯

    项目中每个步骤的中文解释使得非英语背景的开发者也能轻松理解和实现TCP/IP通信。通过分析提供的代码示例,开发者可以学习如何配置TCPnet,创建和管理套接字,以及处理网络事件,如连接建立、数据传输和断开连接等。...

    心跳检测 判系统是否还在正常运行

    本文将深入探讨C#环境下如何利用Socket和TCP/IP协议进行心跳检测,以便判断一个系统是否仍在正常运行。 首先,让我们理解心跳检测的基本概念。心跳检测,也称为“ping-pong”或“keep-alive”,是两个通信节点之间...

    tcp通信实现

    5. **错误检测与恢复**:TCP通过校验和、序列号和确认应答来检测丢失或乱序的数据段,并进行重传。在MFC中,`CSocket`类会处理底层的错误检测,而上层应用只需处理连接断开或数据接收失败等事件。 6. **断开连接**...

    TCP_tcp_

    1. 连接建立:TCP采用三次握手建立连接,确保双方都能正常通信。 2. 数据传输:TCP使用滑动窗口机制来控制数据的发送速率,以防止拥塞。 3. 可靠性:TCP通过序列号、确认应答、重传机制等确保数据的可靠传输,即使在...

Global site tag (gtag.js) - Google Analytics