C# 在C中处理TCP服务器中的用户超时#
我正在编写一个简单的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沉默太久,也会发生同样的情况 简单的故事短片。如果在超时时间内未听到来自客户
时间间隔超时时一直处于静默状态。换句话说
客户端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秒)。如果您的时间间隔要短得多,我不建议您这样做,而是使用单个线程检查其他解决方案(如您的解决方案)