【发布时间】:2012-01-10 17:00:35
【问题描述】:
我正在编写一个简单的 C# tcp 消息服务器,它需要对连接的客户端在最后一个 TimeSpan timeout 保持沉默这一事实作出响应。换句话说
- 客户端 A 连接。
- 客户端 A 发送内容。
- 服务器响应客户端 A。
- 客户端 B 连接。
-
timeout时间过去了,客户端 A 没有发送任何内容。 - 服务器向 A 发送“ping”(不是在 network-ping 中,而是在消息中,
SendPing)。 - 客户端 B 发送内容。
- 服务器响应。
-
pingTimeout向 A 发送 ping 后的时间,与 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 个客户端(至少,如果它可以处理更多,它就是积极的)。
【问题讨论】:
标签: c# network-programming scheduling