Delphi-Indy中的TCPclient.connected问题

Delphi-Indy中的TCPclient.connected问题,delphi,delphi-2010,tcpclient,indy,indy10,Delphi,Delphi 2010,Tcpclient,Indy,Indy10,我在Delphi中使用Indy的IdTCPclient.connected函数时遇到问题。我正在使用Indy10和Delphi2010环境。我的问题是每次我检查与IdTCPclient.connected的TCP连接时,都会引发异常,出现以下错误EidSocketError,EidReadTimeOut。有没有办法断开和重新连接?(如重置连接) 注意:我设置了TCPClient.ReTimeout:=30000 重置连接的实施编码如下所示 if IdTCPclient.connected the

我在Delphi中使用Indy的IdTCPclient.connected函数时遇到问题。我正在使用Indy10和Delphi2010环境。我的问题是每次我检查与IdTCPclient.connected的TCP连接时,都会引发异常,出现以下错误EidSocketErrorEidReadTimeOut。有没有办法断开和重新连接?(如重置连接)

注意:我设置了TCPClient.ReTimeout:=30000

重置连接的实施编码如下所示

if IdTCPclient.connected then
  begin
  IdTCPclient.IOHandler.InputBuffer.Clear;
  IdTCPclient.Disconnect;
  end;
sleep(1000);
try
  IdTCPclient.connect;
  except
    on E: Exception do 
      MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
  end;
但有一点,我遇到了异常,它根本无法连接。我不确定我做错了什么

我应该这样做吗

  • 先断开
  • 清除输入缓冲区
  • 销毁TCPclient
  • 重新创建新的TCPclient
  • 然后再连接它
如果是这样的话,有人能给我一个正确的方法吗

另外,在我的代码中还有另一个重新连接TCP的功能。这也给了我一个例外。在向TCP发送消息之前,我检查了连接。如果没有连接,我会重新连接五次

result := IdTCPclient.connected
if not result then
  begin
  for k:=0 to 4 do
    beign
    sleep(1000);
    try
      TCPclient.connect;
      except
        on E: Exception do 
          MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
      end
    result := TCPclient.connected;
    if result then break;
    end;
通过以上两种编码,程序可以很好地处理重新连接和重置连接。但在某些情况下,程序根本无法重新连接或重置连接

  • 当我遇到异常时该怎么办?我应该从异常重新连接吗
  • 我们如何构建代码来定期检查连接
  • 我们如何构建编码以在连接丢失时恢复连接
亲切问候,

Connected()
不应该引发任何异常。如果是,那么它很可能是一个bug。请提供一个堆栈跟踪来显示这一点

最好的选择是尽可能避免使用
Connected()
。当您需要执行I/O操作时,只需这样做,如果发生故障,让Indy引发异常。你可以在那一刻处理它,例如:

try
  IdTCPClient.DoSomething...
except
  on E: EIdException do begin
    Reconnect;
  end;
end;

procedure Reconnect;
var
  k: Integer;
begin
  IdTCPClient.Disconnect;
  if IdTCPClient.IOHandler <> nil then
    IdTCPClient.IOHandler.InputBuffer.Clear;

  for k := 0 to 4 do
  begin
    Sleep(1000);
    try
      IdTCPClient.Connect;
      Exit;
    except
      on E: Exception do
      begin
        MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
        if k = 4 then
          raise;
      end;
    end;
  end; 
end;
试试看
IdTCPClient.DoSomething。。。
除了
在E:EID上,异常是否开始
重新连接;
结束;
结束;
程序重新连接;
变量
k:整数;
开始
IdTCPClient.Disconnect;
如果IdTCPClient.IOHandler为nil,则
IdTCPClient.IOHandler.InputBuffer.Clear;
对于k:=0到4 do
开始
睡眠(1000);
尝试
IdTCPClient.Connect;
出口
除了
关于E:Exception-do
开始
MessageDlg('连接错误:'+E.Message,mtError,[mbOk],0);
如果k=4,则
提高;
结束;
结束;
结束;
结束;

连接之前,请确保idftp的被动布尔值为false
当您需要文件传输时,请不要使用“二进制文件”选项将其更改为“真”

我是否可以建议将您的问题分成几个较小的问题,这些问题可以单独回答。可能与此类似?与OP类似,我看到Indy10 Connected()引发了一个异常。堆栈跟踪此处没有行号-抱歉@罗迪:那没有道理
ReadDataFromSource()
不会被调用,除非套接字首先处于可读状态(
TIdSocketHandle.readable()
返回True),这仅在套接字有实际数据要读取,或者对等方已正常断开连接时才会发生。
Receive()。实际引发了什么异常,报告了什么套接字错误代码?
EIdSocketError
,10054由对等方重置连接。这确实很奇怪,但似乎可以修复。Indy是MJF的最新SVN。我有一个“工作”连接,然后拔下插头。客户端尝试发送数据并获取EIdSocketError(这很好),但在异常处理程序中,我调用Connected(),它也会引发相同的异常。读取由另一个线程处理。啊,这解释了为什么
Receive()
可能会失败。结果是
TIdStackBSDBase.Receive()
正在调用
CheckForSocketError()
,但是
TIdIOHandler
希望处理套接字错误(通过让
Connected()
放弃它)。我必须研究一下,我认为
TIdStack
类调用的
CheckForSocketError()
通常太多了。无论如何,您都不应该调用
Connected()
。您已经知道套接字没有连接,因为您收到了一个
EIdSocketError/10054
异常,因此调用
connected()
将是多余的。@Remy有一次(6年前)您说过,来自TIdTCPClient的connected()不应该引发任何异常,但它确实存在。这是一个尚未解决的老错误吗?