Я пишу простой C # tcp сервер сообщений, который должен реагировать на тот факт, что подключенный клиент молчал последние TimeSpan timeout
. Другими словами
- Клиент А подключается.
- Клиент А отправляет вещи.
- Сервер отвечает клиенту A.
- Клиент B подключается.
timeout
время проходит без отправки клиентом А
- Сервер отправляет "ping" (не как при сетевой проверке, а как в сообщении,
SendPing
) на A.
- Клиент Б отправляет вещи.
- Сервер отвечает.
pingTimeout
время после того, как пинг был отправлен A, соединение с A разорвано, а клиент удален.
- То же самое происходит, если B слишком долго молчит.
Простой рассказ. Если в timeout
не было слышно ни слова из client[n]
, отправьте пинг. Если на 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();
}
}
будет просто жарить процессор и будет совсем нехорошо. Есть ли хороший простой алгоритм / класс для обработки подобных случаев, который можно легко реализовать в C #? И он должен поддерживать 100-500 клиентов одновременно (как минимум, это только положительно, если он может обрабатывать больше).