Как полностью отключить TCPClient? (Инди)

Когда мой Tcpclient работает, с этим кодом:

TCPClient.Disconnect;
TCPClient.Connect;

Я получаю сообщение "вызванное исключение класса EIdAlreadyConnected с сообщением "Уже подключено"." по-прежнему возникает ошибка (тогда как раньше оно было отключено).

Итак, как я могу отключить его полностью?

Спасибо


person Kermia    schedule 26.08.2010    source источник


Ответы (2)


используя indy 10, вы должны убедиться, что inputbuffer пуст.

if idTcpClient.connected then
begin
 idTcpClient.IOHandler.InputBuffer.clear;
 idTcpClient.Disconnect;
end;
person sabri.arslan    schedule 26.08.2010
comment
Чтобы уточнить, метод Connected() считает, что соединение все еще открыто, даже если физический сокет был закрыт, если в InputBuffer все еще есть ожидающие непрочитанные данные, которые могут удовлетворить запросы на чтение, не возвращаясь к сокету. Это по дизайну. Как правило, вы отключаете сокет только после того, как прочитаете все данные, которые может предложить соединение. Если вы отключаетесь преждевременно, вам необходимо очистить все уже полученные, но непрочитанные данные вручную, очистив InputBuffer. - person Remy Lebeau; 27.08.2010
comment
И убедитесь, что параметры сокета LINGER не установлены? - person Marco van de Voort; 17.10.2011
comment
Разве вы не должны очищать буфер после его отключения? Потому что предположим, что он получает какие-то данные в промежутке между моментом очистки и моментом отключения? - person Jerry Dodge; 29.06.2012
comment
Я тоже хотел бы знать, правильный ли порядок в примере (сначала очистить, затем отключить)? - person StanE; 22.05.2015
comment
Заказ должен быть отменен, я столкнулся с этой проблемой сегодня. (Дельфи ХЕ5) - person Wodzu; 04.04.2017
comment
Насколько я помню, если вас не волнует буфер, вы должны очистить буфер перед отключением, но indy может исправить эту проблему, потому что я написал это решение для Delphi 7, а indy версия, насколько я помню, была 9 - person sabri.arslan; 10.04.2017

Вы говорите, что он отключен, но вы только дали команду на отключение.

Сетевой трафик требует времени, и, вероятно, вы повторно подключились до того, как действительно отключились.

Вероятно, вам нужно отслеживать какое-то состояние соединения или событие, чтобы дождаться, пока вы действительно не отключитесь.

... или попытаться обработать исключение и проигнорировать его, используя try..except

person Marco van de Voort    schedule 26.08.2010
comment
Indy не использует асинхронную связь, поэтому интуитивно понятно, что когда команда возвращает значение, она уже выполнила свою работу. - person jpfollenius; 27.08.2010
comment
Проблема в определении работы. Отправка отключения или его подтверждение/тайм-аут, чтобы полностью отключиться. - person Marco van de Voort; 27.08.2010