Какой лучший способ разорвать соединение в indy10? - PullRequest
0 голосов
/ 16 февраля 2011

я использую indy10 для своих сообщений, и иногда, когда клиент отключается, возникает исключение, мне было интересно, какой самый безопасный способ отключить соединение (TIdContext)?

и что я должен делать на OnDisconnectдаже и похоже?

спасибо.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Возбуждение исключения - это нормальное поведение.Indy предназначен для интенсивного использования исключений не только для обработки ошибок, но и для внутренних уведомлений и тому подобного.OnDisconnect срабатывает, когда TIdTCPServer обнаруживает, что соединение установлено, либо из-за того, что клиент отключился (и TIdTCPServer обработал исключение для вас), либо из-за того, что в вашем коде обработчика OnExecute произошло необработанное исключение.В любом случае, используйте OnDisconnect для выполнения любой необходимой очистки.TIdTCPServer закроет сокет для вас после выхода из обработчика события OnDisconnect.

0 голосов
/ 19 июня 2011

Я просто хочу добавить кое-что о внутренней работе сокетов (TCP), которую я знаю:

Все, что сервер и клиент делают, они отправляют фрагменты данных друг другу. Сервер отличается от клиента только тем, что он пассивен до тех пор, пока любой клиент не отправит сначала запрос на подключение. Но если клиент хочет или вынужден разорвать соединение, все, что нужно сделать, это остановить передачу данных на сервер . Чтобы изящно закрыть соединение, клиент может отправить специальные данные об этом событии, например сказать «Goodbay» по телефону, но это не обязательно. Просто представьте себе телефонный звонок от вас ( клиент ) на любую услугу ( сервер ). Вы начинаете разговор с "привет", и работник службы отвечает. Если вы случайно нажмете кнопку сброса на вашем телефоне, звонок будет потерян. Но сервис все равно продолжает свою работу. И вы можете сделать это снова. Ничего плохого из этого не происходит.

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

На все остальное уже ответил Реми Лебо .

...