【问题标题】:Handling user-timeouts in TCP server in C#在 C# 中处理 TCP 服务器中的用户超时
【发布时间】:2012-01-10 17:00:35
【问题描述】:

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

  1. 客户端 A 连接。
  2. 客户端 A 发送内容。
  3. 服务器响应客户端 A。
  4. 客户端 B 连接。
  5. timeout 时间过去了,客户端 A 没有发送任何内容。
  6. 服务器向 A 发送“ping”(不是在 network-ping 中,而是在消息中,SendPing)。
  7. 客户端 B 发送内容。
  8. 服务器响应。
  9. pingTimeout 向 A 发送 ping 后的时间,与 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# network-programming scheduling


    【解决方案1】:

    我认为如果您使用专用线程并将Thread.Sleep(1000) 放在那里,您的解决方案就可以了,这样您就不会像您说的那样炸CPU。 避免在这个线程上阻塞调用例如确保你对SendPing和Drop的调用是异步的,所以这个线程只做一件事。

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

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 2014-06-26
      • 2011-05-13
      • 1970-01-01
      • 2011-09-15
      • 2023-03-07
      • 1970-01-01
      • 2016-01-12
      • 2022-07-29
      相关资源
      最近更新 更多