Как бороться с дропами сети и Indy IdTCPServer - PullRequest
8 голосов
/ 27 июля 2010

Я создал приложение клиент / сервер с компонентом IdTCPServer. Клиенты подключаются и поддерживают постоянное соединение в течение всего срока службы приложения. Если сетевое соединение разорвано (что происходит довольно часто, потому что клиенты подключаются с помощью беспроводных карт), клиент автоматически подключится заново. Это все отлично работает.

Моя проблема связана с сокетами на сервере, соответствующими потерянному соединению. Они не обнаруживают пропадание сети и отключают себя. Прочитав несколько статей, я узнал, что у сервера нет возможности узнать, было ли разорвано соединение. Надо ждать какого-то события, чтобы это выяснить.

Итак, мой вопрос, должен ли я встроить какой-нибудь механизм в мой сервер, чтобы периодически «обрабатывать» сокеты с потерянными соединениями? И если да, то как? Я думал, что одним из способов будет сделать цикл через все соединения и попытаться отправить им данные. Я считаю, что это вызовет необходимое «событие».

1 Ответ

6 голосов
/ 27 июля 2010

Какой-то сигнал сердцебиения или проверки связи, отправляемый от клиента к серверу через регулярные промежутки времени, может использоваться для поддержания сеанса на стороне сервера.Если сигнал останавливается и проходит интервал времени ожидания, сервер может предположить, что клиент потерял соединение.

(Если сервер просто использует соединение через сокет для отправки данных обратно клиенту, сервер не можетзнать, получил ли клиент его. Данные могут быть где-то посередине.)

...