Проверьте, закрыто ли соединение! - PullRequest
2 голосов
/ 28 июля 2010

Я написал приложение Delphi (2009) с Indy (TCPServer / Client). И у меня есть проблема на уровне TCPServer: он обнаруживает отключение (после перезагрузки ПК) Клиента только тогда, когда клиент пытается еще раз подключиться к серверу. Я выполнил свое приложение шаг за шагом, и когда клиент пытается восстановить соединение (после перезагрузки), сервер вызывает исключение (я думаю, молчаливое): сброс соединения по пиру Почему это исключение слишком поздно.

(Я думаю, что список потоков не освобождается сразу)

Что ты думаешь?

1 Ответ

3 голосов
/ 28 июля 2010

Это низкоуровневая деталь протокола TCP. По умолчанию он не передает пакеты keep-alive, поскольку это приводит к потере пропускной способности, поэтому он осознает, что соединение прервалось только тогда, когда что-то происходит, что побуждает его проверить соединение. (Я не уверен, почему переподключение с того же клиента может вызвать это.)

Вы можете сделать так, чтобы TCP отправлял обычные пакеты keep-alive, чтобы обнаруживать разъединения ранее. В windows это может быть активировано серверным приложением, но настраивается через реестр (подробности см. здесь ).

Вы также можете реализовать механизм поддержания активности на уровне протокола, заставив клиента или сервер отправлять случайные нулевые пакеты (пакет, который ничего не делает в частности). Это, очевидно, требует, чтобы используемый протокол определял какое-то интересное сообщение «ничего не делать» или «ничего не делать» (NOOP, STATUS, PING ... и тому подобное).

...