2010-08-26 15 views
12

Cuando mi TCPClient está trabajando, con este código:¿Cómo desconectar TCPClient Totally? (Indy)

TCPClient.Disconnect; 
TCPClient.Connect; 

me sale "elevó clase de excepción EIdAlreadyConnected con el mensaje 'Ya está conectado.'." error todavía (mientras que antes se desconectó).

Entonces, ¿cómo puedo desconectarlo por completo?

Gracias

Respuesta

16

utiliza en Indy 10 debe asegurarse inputbuffer está vacío.

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

Gracias, lo intentaré – Kermia

+8

Para más detalles, el método Connected() considera que una conexión aún estará abierta, incluso si el socket físico se ha cerrado, si el InputBuffer todavía tiene datos no leídos pendientes que pueden satisfacer las solicitudes de lectura sin volver al enchufe. Esto es por diseño. Normalmente, desconectaría el socket solo después de haber leído todos los datos que la conexión tiene para ofrecer. Si se desconecta prematuramente, debe borrar manualmente los datos ya recibidos pero no leídos borrando el InputBuffer. –

+0

Gracias, señor Lebeau – Kermia

1

Usted dice que está desconectado, pero sólo se dio la orden de desconectar.

El tráfico de red lleva tiempo, y probablemente se haya reconectado antes de que estuviera realmente desconectado.

Probablemente necesite supervisar algún estado de conexión o evento para esperar hasta que realmente esté desconectado.

... o tratar de procesar la excepción e ignorarlo, utilizando try..except

+0

Gracias. Por favor, muéstreme un ejemplo – Kermia

+1

Indy no * * utiliza comunicación asíncrona, por lo que la intuición sería que cuando el comando regresa ya ha hecho su trabajo. – jpfollenius

+0

El problema es la definición del trabajo. El envío de la desconexión o la confirmación/tiempo de espera para que se cierre por completo. –

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