2010-08-26 62 views
12

当我的TcpClient的是工作,有了这个代码: “出现的异常类EIdAlreadyConnected有消息。 '已连接'”如何完全断开TCPClient? (印)

TCPClient.Disconnect; 
TCPClient.Connect; 

我得到错误仍然存​​在(而之前它已断开连接)。

那么,我怎样才能完全断开它?

谢谢

回答

16

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

谢谢,我会试试 – Kermia 2010-08-26 14:30:14

+8

详细说明,即使物理套接字已经关闭,如果InputBuffer仍然有待处理的未读取数据可以满足读取请求,Connected()方法仍认为连接仍然处于打开状态无需返回到套接字。这是设计。通常,只有在读取了连接所需的所有数据后,才能断开套接字。如果您过早断开连接,则必须通过清除InputBuffer手动清除任何已接收但未读取的数据。 – 2010-08-26 21:03:03

+0

谢谢Lebeau先生 – Kermia 2010-08-27 05:52:14

1

你说它是断开的,但你只给了断开命令。

网络流量需要时间,并且可能在您断开连接之前重新连接。

也许你需要监视一些连接状态或事件,等到你真的断开连接。

...或者尝试处理异常,并使用在印第安纳波利斯10,您必须确保INPUTBUFFER是空的忽略它,使用try..except

+0

谢谢。请给我一个例子 – Kermia 2010-08-26 12:58:56

+1

Indy不*使用异步通信,所以直觉就是当命令返回时它已经完成了它的工作。 – jpfollenius 2010-08-27 11:51:15

+0

问题在于作业的定义。断开连接的发送,或者确认/超时,以使其完全关闭。 – 2010-08-27 13:03:41

1
TCPClient.IOHandler.InputBuffer.Clear; 
TCPClient.IOHandler.CloseGracefully; 
TCPClient.Disconnect; 
相关问题