在c#中处理TCP服务器中的用户超时

本文关键字:用户 服务器 超时 TCP 处理 | 更新日期: 2023-09-27 18:16:26

我正在编写一个简单的c# tcp消息服务器,它需要响应一个已连接的客户端在最后一个TimeSpan timeout保持沉默的事实。换句话说

  1. 客户端A连接。
  2. 客户端A发送东西。
  3. 服务器响应客户端a
  4. 客户端B连接。
  5. timeout时间过去,客户端A没有发送任何消息。
  6. 服务器发送"ping"(不像网络ping,而是像一个消息,SendPing)到a。
  7. 客户端B发送东西。
  8. 服务器响应
  9. pingTimeout次ping到A后,断开与A的连接,客户端被移除。
  10. 如果B静音时间过长,也会发生相同的情况。

简单的故事。如果在timeout中没有听到client[n]的消息,则发送ping。如果ping得到响应,只需更新client[n].LastReceivedTime,然而,如果client[n]pingTimeout内没有响应,则断开连接。

据我所知,这必须通过某种调度器来完成,因为简单地做一个循环,像这样

while(true) {
    foreach(var c in clients) {
        if(DateTime.Now.Subtract(c.LastReceivedTime) >= timeout && !c.WaitingPing)
            c.SendPing();
        else if(DateTime.Now.Subtract(c.LastReceivedTime) >= timeout + pingTimeout && c.WaitingPing)
            c.Drop();
    }
}

只会把CPU炸了,一点用都没有。是否有一个很好的简单的算法/类来处理这样的情况,可以很容易地在c#中实现?并且它需要同时支持100-500个客户端(至少,只有当它可以处理更多时,它才是正的)。

在c#中处理TCP服务器中的用户超时

你的解决方案是好的,我想如果你使用一个专用线程,并把Thread.Sleep(1000)在那里,所以你不像你说的炒CPU。避免阻塞这个线程的调用例如确保你对SendPingDrop的调用是异步的,所以这个线程只做一件事。

另一个解决方案是使用System.Timers.Timer每个客户端连接,它的间隔等于ping定时器。我正在使用这种方法,并与500个客户进行了测试,没有问题。(20秒间隔)。如果您的间隔很短,我不建议这样做,并查看使用单个线程检查的其他解决方案(如您的解决方案)

相关文章: