2010-08-26 4 views
12

Quand mon tcpclient travaille, avec ce code:Comment déconnecter le TCPClient Totalement? (Indy)

TCPClient.Disconnect; 
TCPClient.Connect; 

je reçois "a soulevé classe d'exception EIdAlreadyConnected avec le message". Déjà connecté." erreur encore (alors qu'il a été déconnecté auparavant).

Alors, comment puis-je le déconnecter complètement?

Merci

Répondre

16

à utiliser indy 10 vous devez vous INPUTBUFFER est vide.

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

Merci, je vais l'essayer – Kermia

+8

Pour développer, la méthode Connected() considère qu'une connexion est toujours ouverte, même si le socket physique a été fermé, si le InputBuffer a encore des données non lues en attente qui peuvent satisfaire les requêtes de lecture sans retourner à la prise. C'est par conception. En règle générale, vous ne déconnecter le socket qu'après avoir lu toutes les données que la connexion a à offrir. Si vous vous déconnectez prématurément, vous devez effacer manuellement les données déjà reçues mais non lues en effaçant le InputBuffer. –

+0

Merci Mr Lebeau – Kermia

1

Vous dites qu'il est déconnecté, mais vous ne donna l'ordre de se déconnecter.

Le trafic réseau prend du temps et probablement vous vous êtes reconnecté avant d'être vraiment déconnecté.

Vous devez probablement surveiller certains états ou événements de connexion pour attendre que vous soyez vraiment déconnecté.

... ou essayer de traiter l'exception et l'ignorer, en utilisant try..except

+0

Merci. Veuillez me montrer un exemple – Kermia

+1

Indy n'utilise pas de communication asynchrone, donc l'intuition serait que lorsque la commande revient, elle a déjà fait son travail. – jpfollenius

+0

Le problème est la définition du travail. L'envoi de la déconnexion, ou il est confirmé/timeout pour qu'il soit complètement éteint. –

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