`
zhangyafei_kimi
  • 浏览: 266182 次
  • 性别: 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 连接非正常断开检测 在网络通信中,TCP 连接的非正常断开是指在非优雅的方式下断开连接,例如网线故障、物理链路中断、主机断电等原因引起的连接断开。如何及时检测出这种非正常断开的 TCP 连接是非常重要的。 ...

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

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

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

    4. **权限**:由于涉及到底层网络控制,使用tcp_killer可能需要root权限,特别是在尝试关闭其他非特权用户的连接时。 5. **ICMP协议**:在某些情况下,tcp_killer可能会用到ICMP协议,例如发送ping请求来检查网络...

    linux TCP服务器连接时发不出数据

    本文主要探讨了在Linux环境下,当TCP服务器与客户端建立连接后,服务器在某些情况下无法向客户端正常发送数据的问题。具体场景为:服务器与两个客户端进行连接,并通过epoll机制实现非阻塞模式下的通信。客户端会...

    incubator_labview_TCP断线重连_tcp通信

    实现自动识别网络状态,我们可以定期使用"检查TCP连接"VI来检测TCP连接是否仍然有效。如果返回的状态为“已断开”,则表示网络连接中断。 4. **断线重连机制**: 当检测到网络断开时,我们需要设计一个重连逻辑。...

    WinEggDrop-Kill-TCP.rar_WinEggDrop_kill tcp

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

    判断Socket是否断开的小代码

    - 当检测到Socket连接断开时,调用`CloseSocket`方法关闭Socket。 - 读取并处理接收到的数据。 #### 代码详解 ```csharp private void OnReceive(object ob) { var key = ClientSocket.LocalEndPoint as ...

    TCP&UDP;测试工具

    2. **连接测试**:测试TCP连接的建立和断开,检查网络路径的可达性。 3. **速度测试**:测量数据传输速率,对比TCP和UDP在不同条件下的表现。 4. **丢包率**:通过发送大量数据包并计算未收到的响应,来评估网络中的...

    愤怒_STM32F107以太网TCP客户端收发数据实验

    中断用于快速响应数据接收,而定时器用于检测连接状态和触发数据重传。 8. **错误处理**:在编程过程中,需要考虑各种可能出现的错误情况,例如连接失败、数据发送失败或网络中断。良好的错误处理机制可以提高系统...

    boost的tcp服务器

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

    tcp sokcet 测试工具,支持Client和server端

    这个测试工具能够模拟这两种角色,帮助开发者检查和调试TCP连接的建立、数据交换和断开过程。 2. **自动重连模式**:在实际网络环境中,由于各种原因,TCP连接可能会中断。自动重连功能使得工具在连接断开后能自动...

    Java实现Socket长连接和短连接

    - 心跳机制:定期发送心跳包,检测连接是否有效,防止因网络问题导致的“假死”连接。 长连接的实现可能涉及到线程池、连接池等技术,以及异常处理和超时策略。 **3. 实现原理** - **Java Socket API**:Java提供...

    m26模块TCP通讯驱动代码

    在本文中,我们将深入探讨如何使用C语言为m26模块开发TCP通信驱动代码,以实现稳定可靠的AT指令控制下的TCP连接,以及非阻塞的数据收发和独立的任务处理机制。 1. **m26模块简介** m26模块是一款常见的GPRS/EDGE...

    TCP_tcp_

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

    TCP server程序

    通过这种方式,开发者可以检查服务器是否正确处理各种情况,如正常连接、断开连接、数据错误等。 总的来说,TCP服务器程序的设计和实现涉及网络编程基础、TCP协议原理及异常处理等多方面知识。通过分析和实践`TCP...

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

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

    STM32 tcp/ip通讯

    4. 断开连接:完成通信后,关闭TCP连接,释放资源。 项目中每个步骤的中文解释使得非英语背景的开发者也能轻松理解和实现TCP/IP通信。通过分析提供的代码示例,开发者可以学习如何配置TCPnet,创建和管理套接字,...

    用C语言做的TCP程序

    TCP提供了一种面向连接的服务,即在数据传输前,两个通信端点会先建立一个连接。这个过程通常包括三次握手,确保双方都能正常通信。在连接建立后,数据可以双向传输,直到通过四次挥手断开连接。 C语言实现TCP程序...

    Java TCP 编程

    - **三次握手**:TCP连接的建立需要经过三次握手过程,确保双方都能正常通信。首先,客户端发送一个SYN(同步序列编号)包给服务器,服务器响应一个SYN+ACK包,最后客户端再回应一个ACK(确认)包,完成连接。 - *...

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

    这种模式更适合处理多个并发连接,因为它能有效地利用单个线程来管理多个TCP连接。 在上述问题中,作者遇到了客户端发送数据但服务器未收到的情况。这可能是因为QTcpSocket默认是非阻塞的,数据可能并未立即发送。...

Global site tag (gtag.js) - Google Analytics