Как да прекъсна връзката с 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
Поръчката трябва да бъде върната, срещнах този проблем днес. (Delphi XE5) - 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