我正在写一个简单的C#的TCP消息服务器,需要一个事实,即一个连接的客户端一直沉默不语的最后TimeSpan timeout
回应。换句话说处理用户超时在TCP服务器在C#
- 客户端A连接。
- 客户端A发送内容。
- 服务器响应客户端A.
- 客户端B连接。
timeout
时间过去没有客户端A发送任何东西。- 服务器向A发送“ping”(不是在网络ping中,而是如在消息中,)。
- 客户端B发送内容。
- 服务器响应。
pingTimeout
ping发送到A后,连接到A被丢弃,客户端被删除。- 如果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个客户端(至少,只有它能处理更多的情况才是正面的)。如果使用专用线程,把一个Thread.Sleep(1000)
在那里,所以你不要像你说的炒CPU