TCP连接有效性检测方法

上传人:飞*** 文档编号:40337437 上传时间:2018-05-25 格式:DOC 页数:5 大小:97.50KB
返回 下载 相关 举报
TCP连接有效性检测方法_第1页
第1页 / 共5页
TCP连接有效性检测方法_第2页
第2页 / 共5页
TCP连接有效性检测方法_第3页
第3页 / 共5页
TCP连接有效性检测方法_第4页
第4页 / 共5页
TCP连接有效性检测方法_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《TCP连接有效性检测方法》由会员分享,可在线阅读,更多相关《TCP连接有效性检测方法(5页珍藏版)》请在金锄头文库上搜索。

1、TCP 连接有效性检测方法连接有效性检测方法在写 TCP 服务的时候经常需要面对的问题就是如何知道一个 TCP 连接当前是否有效, 但这个问题对很多初入门的同学来说是很困惑的,主要原因是当对方关闭连 接后,另一方 无法有效的知道;对于同步操作来说可以通过设置操作超时来解决,但异步操作则没有这 样方便的了,那只能等 keepalive 的检测完成引发异 步回调了。 那在编写应用的时候一般通讯什么方式来检测连接的有效性呢?解决方法一般有两种一 种是设置 TCP 的 keepalive 时间,另一种则是通过 Ping,Pong 的方式来实现。前者相对比较 简单通过 socket.IOControl(

2、IOControlCode.KeepAliveValues, inOptionValues, null)方法设置即 可,以下主要但要通过 Ping,Pong 的方式来实现应用层面的 TCP 连接有效性检测。通过 Ping,Pong 来处理有两种方式:服务器主动和被动。 主动主动 这种方式主要是由服务器发起,然后由客户端响应;服务检测每个连接 Pong 响应情况, 如果连接在一段时间内没有 Pong 回应则把相应连接关闭并处理相关会话资源。被动被动 这种方式由 Client 发起 Ping 然后由服务端回应 Pong,如果 Client 是同步操作的话其实服 务端是不需要应答 Pong 包。服务

3、端检测每个连接最近的 Ping 时间,如果超过一段时间没 有 Ping 的情况把相应连接关闭并处理相关会话资源。模式选择模式选择 从上面的两种方式来看显然是被动模式更节省服务器资源,如果采用主动的话服务器 还必须启用一个定时器对现有在线接进行发送 Ping 操作;被动模式就完全不需要了,只有 接收到客户端 Ping 回应一个 Pong 操作。 检测算法检测算法 一般情况会用一个定时器隔一段时间对所有 Client 检测一次,看对应的 Ping 时间是否超时, 如果是则直接关闭和释放资源。但这样是要对所有连接进行扫描,其实在应用中只有很小 部分连接是无效的,如果针对所有在线连接进行一 个扫描那的

4、确一个比较花成本的工作。 为了解决全扫描的情况,可以采用一种简单的算法 LRU,通过 LRU 算法在检测的时候只要扫 冷区数据即可,这样就可以达 到只扫描 Ping 超时的连接。LRU 具体处理结构如下:以下给出相关 LRU 实现的 c#版本代码: / / 基于 LRU 算法的连接检测/ public class LRUDetect:IDisposable/ / 构建检测器/ / 超时时间以毫秒为单位public LRUDetect(int timeout)mTimeout = timeout;mTimer = new System.Threading.Timer(OnDetect, null

5、, mTimeout, mTimeout); private int mTimeout;private System.Threading.Timer mTimer;private LinkedList mLinkedList = new LinkedList();/ 更新连接/ 连接信息public void Update(IConnecton connection)lock (this)LinkedListNode node = connection.Node;if (node != null)node.Value.LastActiveTime = Environment.TickCount

6、;mLinkedList.Remove(node);mLinkedList.AddFirst(node);elsenode = mLinkedList.AddFirst(new Node();node.Value.LastActiveTime = Environment.TickCount;node.Value.Connection = connection;connection.Node = node;/ / 删除连接/ / 连接信息public void Delete(IConnecton connection)lock (this)LinkedListNode node = connec

7、tion.Node;if (node != null)node.Value.Connection = null;mLinkedList.Remove(node);private void OnDetect(object state)lock (this)int cutime = Environment.TickCount;LinkedListNode last = mLinkedList.Last;while (last !=null last.Value.Connection = null;mLinkedList.RemoveLast();last = mLinkedList.Last;/

8、连接描述接口 public interface IConnecton/ / 获取对应在 LRU 算法中的节点/ LinkedListNode Nodeget;set;/ / 超时操作,当 LRU 算法检测到应该连接超时的时候会调用该方法/ void TimeOut();/ / 节点信息/ public class Node/ / 最后活动时间/ public int LastActiveTime;/ / 相关连接信息/ public IConnecton Connection;/ / 检测是否过期/ / / / public bool Detect(int cutime,int timeout)return Math.Abs(cutime - LastActiveTime) timeout;/ / 释放对象/ public void Dispose()if (mTimer != null)mTimer.Dispose();

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号