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

C# 在C中处理TCP服务器中的用户超时#,c#,network-programming,scheduling,C#,Network Programming,Scheduling,我正在编写一个简单的C#tcp消息服务器,它需要响应这样一个事实,即连接的客户端在上一次时间间隔超时时一直处于静默状态。换句话说 客户端A连接 客户A发送东西 服务器响应客户端A 客户端B连接 超时时间流逝,客户端未发送任何内容 服务器向a发送“ping”(与网络ping不同,但与消息中的“发送ping”相同) 客户B发送东西 服务器响应 pingTimeoutping发送到A、断开与A的连接并删除客户端后的时间 如果B沉默太久,也会发生同样的情况 简单的故事短片。如果在超时时间内未听到来自客户

我正在编写一个简单的C#tcp消息服务器,它需要响应这样一个事实,即连接的客户端在上一次
时间间隔超时时一直处于静默状态。换句话说

  • 客户端A连接
  • 客户A发送东西
  • 服务器响应客户端A
  • 客户端B连接
  • 超时
    时间流逝,客户端未发送任何内容
  • 服务器向a发送“ping”(与网络ping不同,但与消息中的“发送ping”相同)
  • 客户B发送东西
  • 服务器响应
  • pingTimeout
    ping发送到A、断开与A的连接并删除客户端后的时间
  • 如果B沉默太久,也会发生同样的情况
  • 简单的故事短片。如果在
    超时时间内未听到来自
    客户端[n]
    的任何消息,请发送ping。如果ping得到响应,只需更新
    客户端[n]。LastReceivedTime
    ,但是,如果
    客户端[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个客户端(至少,只有当它能够处理更多的客户端时才是积极的)。

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

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