2010-08-26 2 views
12

Когда мой TcpClient работает, с этим кодом:Как полностью отключить TCPClient? (Инди)

TCPClient.Disconnect; 
TCPClient.Connect; 

я получаю "поднятом класс исключения EIdAlreadyConnected с сообщением 'Устройство подключено'.." ошибка все еще (в то время как она была отключена раньше).

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

Спасибо

ответ

16

с использованием в Indy 10 вы должны убедиться INPUTBUFFER пуст.

if idTcpClient.connected then 
begin 
idTcpClient.IOHandler.InputBuffer.clear; 
idTcpClient.Disconnect; 
end; 
+0

Спасибо, я попробую. – Kermia

+8

Чтобы разработать, метод Connected() считает, что соединение остается открытым, даже если физический сокет был закрыт, если InputBuffer все еще ожидает в нем непрочитанных данных, которые могут удовлетворять запросам чтения не возвращаясь в розетку. Это по дизайну. Как правило, вы отключите сокет только после того, как вы прочтете все данные, которые может предложить соединение. Если вы преждевременно отключитесь, вам нужно очистить все уже полученные, но непрочитанные данные вручную, очистив InputBuffer. –

+0

Спасибо Mr Lebeau – Kermia

1

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

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

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

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

+0

Спасибо. Пожалуйста, покажите мне пример – Kermia

+1

Indy does * not * использует асинхронную связь, поэтому интуиция будет заключаться в том, что когда команда вернется, она уже выполнила свою работу. – jpfollenius

+0

Проблема заключается в определении задания. Отправка разъединения или подтверждение/тайм-аут, чтобы он полностью отключился. –

1
TCPClient.IOHandler.InputBuffer.Clear; 
TCPClient.IOHandler.CloseGracefully; 
TCPClient.Disconnect; 
Смежные вопросы