TCP连接有效性检测方法.docxVIP

  • 12
  • 0
  • 约3.26千字
  • 约 5页
  • 2023-08-06 发布于上海
  • 举报
TCP 连接有效性检测方法 在写 TCP 服务的时候经常需要面对的问题就是如何知道一个 TCP 连接当前是否有效, 但这个问题对很多初入门的同学来说是很困惑的,主要原因是当对方关闭连 接后,另一方无法有效的知道;对于同步操作来说可以通过设置操作超时来解决,但异步操作则没有这样方便的了,那只能等 keepalive 的检测完成引发异 步回调了。 那在编写应用的时候一般通讯什么方式来检测连接的有效性呢 ?解决方法一般有两种一种是设置 TCP 的 keepalive 时间,另一种则是通过 Ping,Pong 的方式来实现。前者相对比较简单通过 socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null)方法设置即可,以下主要但要通过 Ping,Pong 的方式来实现应用层面的 TCP 连接有效性检测。通过Ping,Pong 来处理有两种方式:服务器主动和被动。 主动 这种方式主要是由服务器发起,然后由客户端响应;服务检测每个连接 Pong 响应情况, 如果连接在一段时间内没有 Pong 回应则把相应连接关闭并处理相关会话资源。 被动 这种方式由 Client 发起 Ping 然后由服务端回应 Pong,如果 Client 是同步操作的话其实服务端是不需要应答 Pong 包。服务端检测每个连接最近的Ping 时间,如果超过一段时间没有Ping 的情况把相应连接关闭并处理相关会话资源。 模式选择 从上面的两种方式来看显然是被动模式更节省服务器资源,如果采用主动的话服务器还必须启用一个定时器对现有在线接进行发送 Ping 操作;被动模式就完全不需要了,只有接收到客户端 Ping 回应一个 Pong 操作。 检测算法 一般情况会用一个定时器隔一段时间对所有Client 检测一次,看对应的 Ping 时间是否超时, 如果是则直接关闭和释放资源。但这样是要对所有连接进行扫描,其实在应用中只有很小部 分连接是无效的,如果针对所有在线连接进行一 个扫描那的确一个比较花成本的工作。为了解决全扫描的情况,可以采用一种简单的算法 LRU,通过 LRU 算法在检测的时候只要扫冷区数据即可,这样就可以达 到只扫描 Ping 超时的连接。LRU 具体处理结构如下: 以下给出相关 LRU 实现的 c#版本代码: /// summary /// 基于 LRU 算法的连接检测 /// /summary public class LRUDetect:IDisposable { /// summary /// 构建检测器 /// /summary /// param name=timeout超时时间以毫秒为单位/param public LRUDetect(int timeout) { mTimeout = timeout; mTimer = new System.Threading.Timer(OnDetect, null, mTimeout, mTimeout); } private int mTimeout; private System.Threading.Timer mTimer; private LinkedListNode mLinkedList = new LinkedListNode(); /// summary 更新连接/summary /// param name=connection连接信息/param public void Update(IConnecton connection) { lock (this) { LinkedListNodeLRUDetect.Node node = connection.Node; if (node != null) { } else { node.Value.LastActiveTime = Environment.TickCount; mLinkedList.Remove(node); mLinkedList.AddFirst(node); node = mLinkedList.AddFirst(new Node()); node.Value.LastActiveTime = Environment.TickCount; node.Value.Connection = connection; connection.Node = node; } } } /// summary /// 删除连接 /// /summary /// param name=connection连接信息/param public void Delete(IConnecton connection) { lock (this) { LinkedLis

文档评论(0)

1亿VIP精品文档

相关文档