Как бороться с падением сети и Indy IdTCPServer

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

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

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


person M Schenkel    schedule 27.07.2010    source источник


Ответы (1)


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

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

person mjn    schedule 27.07.2010
comment
хорошая точка зрения. Как бы то ни было, я сохраняю последний пульс для каждого соединения. И я мог бы легко построить логику, как вы предлагаете. - person M Schenkel; 28.07.2010