2010-08-26 7 views
12

Als mein TcpClient arbeitet, mit diesem Code: "angehoben Ausnahmeklasse EIdAlreadyConnected mit Meldung 'Bereits verbunden'"So trennen Sie den TCPClient vollständig? (Indy)

TCPClient.Disconnect; 
TCPClient.Connect; 

ich Fehler immer noch (während es zuvor getrennt wurde).

Also, wie kann ich es vollständig trennen?

Danke

Antwort

16

bei indy 10 unter Verwendung müssen Sie sicherstellen inputbuffer leer.

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

Vielen Dank, ich werde es versuchen – Kermia

+8

Um zu erläutern, betrachtet die Connected() - Methode eine Verbindung noch offen zu sein, auch wenn der physische Socket geschlossen wurde, wenn der InputBuffer noch ausstehende ungelesene Daten enthält, die Leseanforderungen erfüllen können ohne zurück zum Sockel zu gehen. Das ist Absicht. Normalerweise würden Sie den Socket erst trennen, nachdem Sie alle Daten gelesen haben, die die Verbindung anbieten muss. Wenn Sie die Verbindung vorzeitig trennen, müssen Sie alle bereits empfangenen, aber ungelesenen Daten manuell löschen, indem Sie den InputBuffer löschen. –

+0

Vielen Dank Herr Lebeau – Kermia

1

Sie sagen, dass es getrennt ist, aber man gab nur den Befehl zu trennen.

Netzwerkverkehr braucht Zeit, und wahrscheinlich haben Sie wieder verbunden, bevor Sie wirklich getrennt wurden.

Wahrscheinlich müssen Sie einen Verbindungsstatus oder ein Ereignis überwachen, um zu warten, bis Sie wirklich getrennt sind.

... oder versuchen, die Ausnahme zu verarbeiten und ignorieren, try..except

mit
+0

Danke. Bitte zeigen Sie mir ein Beispiel – Kermia

+1

Indy verwendet * keine * asynchrone Kommunikation, also würde die Intuition sein, dass wenn der Befehl zurückkommt, es seine Arbeit bereits erledigt hat. – jpfollenius

+0

Das Problem ist die Definition des Jobs. Das Senden der Trennung, oder es wird bestätigt/Timeout, so dass es vollständig heruntergefahren wird. –

1
TCPClient.IOHandler.InputBuffer.Clear; 
TCPClient.IOHandler.CloseGracefully; 
TCPClient.Disconnect;