Delphi 印第FTP突然断开

Delphi 印第FTP突然断开,delphi,ftp,indy,Delphi,Ftp,Indy,客户端总是在同一点停止下载。它每次下载1310个文件中的230个 我得到以下信息: 连接优雅地关闭 例外情况是: 第一次机会例外价格为755FC762美元。异常类EIdSocketError 带有消息“套接字错误#10054对等方重置连接”。过程 FTPSTest.exe(8816) 这是我的代码: var ftp: TIdFTP; ssl: TIdSSLIOHandlerSocketOpenSSL; log: TIdLogFile; filename: string; begi

客户端总是在同一点停止下载。它每次下载1310个文件中的230个

我得到以下信息:

连接优雅地关闭

例外情况是:

第一次机会例外价格为755FC762美元。异常类EIdSocketError 带有消息“套接字错误#10054对等方重置连接”。过程 FTPSTest.exe(8816)

这是我的代码:

var
  ftp: TIdFTP;
  ssl: TIdSSLIOHandlerSocketOpenSSL;
  log: TIdLogFile;
  filename: string;
begin
  ftp := TIdFTP.Create(self);
  ssl := TIdSSLIOHandlerSocketOpenSSL.Create(ftp);
  log := TIdLogFile.Create(ftp);
  try
    log.Filename := Format('C:\ftplog\logfile_%s.log', [FormatDateTime('yyyymmdd_hhnnsszzz', now)]);
    log.Active := true;

    ssl.SSLOptions.SSLVersions := [sslvTLSv1_1, sslvTLSv1_2];
    {ssl.SSLOptions.CipherList :=
      'ECDHE-ECDSA-AES128-SHA256:' +
      'ECDHE-ECDSA-AES256-SHA384:' +
      'ECDHE-ECDSA-AES128-GCM-SHA256:' +
      'ECDHE-ECDSA-AES256-GCM-SHA384:' +
      'ECDHE-ECDSA-AES128-CCM:' +
      'ECDHE-ECDSA-AES256-CCM:' +
      'ECDHE-RSA-AES128-SHA256:' +
      'ECDHE-RSA-AES256-SHA384:' +
      'ECDHE-RSA-AES128-GCM-SHA256:' +
      'ECDHE-RSA-AES256-GCM-SHA384:' +
      'DHE-DSS-AES128-SHA256:' +
      'DHE-DSS-AES256-SHA256:' +
      'DHE-DSS-AES128-GCM-SHA256:' +
      'DHE-DSS-AES256-GCM-SHA384:' +
      'DHE-RSA-AES128-SHA256:' +
      'DHE-RSA-AES256-SHA256:' +
      'DHE-RSA-AES128-GCM-SHA256:' +
      'DHE-RSA-AES256-GCM-SHA384:' +
      'DHE-RSA-AES128-CCM:' +
      'DHE-RSA-AES256-CCM';}

    ftp.Intercept := log;
    ftp.IOHandler := ssl;

    ftp.UseTLS := utUseExplicitTLS;
    ftp.AUTHCmd := tAuthTLS;
    ftp.Host := 'secretdomain.de';
    ftp.Port := 21;
    ftp.Username := 'mysecretuser';
    ftp.Password := 'mysecretpw';
    ftp.Passive := true;
    ftp.DataPortProtection := ftpdpsPrivate;
    ftp.TransferType := ftBinary;
    ftp.ConnectTimeout := 120000;

    ftp.Connect;
      if ftp.Connected then begin
        ftp.ChangeDir('V2_DOWN');
        ftp.List('*.XML', false);
        ShowMessage(IntToStr(ftp.ListResult.Count));
        for filename in ftp.ListResult do
          ftp.Get(filename, 'C:\temp\'+filename);
      end;
  finally
    ftp.Free;
  end;
end;
您可以在此处查看IdLogFile:

这是wireshark必须告诉我/我们的:

我做错了什么

更新20190722 22:15 CEST

是的,FTP会话通过路由器/防火墙。 最大的文件是341.277字节。 它与其他客户机(如FileZilla)一起工作

如果我设定

ftp.NATKeepAlive.UseKeepAlive := true;
然后我得到

第一次机会例外价格为755FC762美元。异常类EIdSocketError 带有消息“套接字错误#10054对等方重置连接”。过程 FTPSTest.exe(5128)

下一个呢

第一次机会例外价格为755FC762美元。异常类EIdNotASocket 带有消息“套接字错误#10038非套接字上的套接字操作”。 处理FTPSTest.exe(5128)

更新20190722 22:28 CEST

我也试过:

for i := 0 to ftp.ListResult.Count - 1 do begin
  if i mod 7 = 0 then
    ftp.Noop;
  ftp.Get(ftp.ListResult[i], 'C:\temp\'+ftp.ListResult[i]);
end;
更新20190723 05:37 CEST

没有变化

ftp.NATKeepAlive.IdleTimeMS := 12000;
ftp.NATKeepAlive.IntervalMS := 2000;
这是一个SSL+服务器防火墙问题

如果我把这些行注释掉,它的效果非常好。我得到了所有1.310文件:

ftp.IOHandler := ssl;
ftp.UseTLS := utUseExplicitTLS;
ftp.AUTHCmd := tAuthTLS;
ftp.DataPortProtection := ftpdpsPrivate;
我禁用了所有客户端防火墙。
现在,我将向服务器提供商询问他们的防火墙日志。

如果这是Indy的问题,这里的专家应该能够帮助您解决。我注意到您的客户机是VMWare托管的,并且似乎记得几年前遇到过一个非常类似的问题,即批量传输文件,我通过在某个.Ini文件中调整VM的连接参数来解决了这个问题。我记不起细节,但我不必花太长时间在谷歌上搜索来找到解决方案。你的FTP会话是否通过路由器/防火墙?文件230/231是一个大文件吗?FTP对命令和传输使用单独的TCP连接。传输过程中,命令连接处于空闲状态。不知道FTP的防火墙/路由器如果空闲时间过长,可能会终止该连接
TIdFTP
有一个默认禁用的
NATKeepAlive
属性,请尝试启用它,看看是否有帮助。它在每次传输期间打开命令连接上的TCP keepalives,因此不会处于空闲状态。我已更新了我的问题,提供了更多信息和您问题的答案。现在我真的很害怕,因为我在异常对话框中点击了break之后,在IdStack单元中读取了readme。我现在会被公开鞭笞、涂焦油和涂羽毛吗?@complete\u陌生人仅仅将
ftp.NATKeepAlive.UseKeepAlive
设置为true是不够的,还必须将
ftp.NATKeepAlive.idletimes
ftp.NATKeepAlive.intervals
设置为非零值。在传输之间发送
NOOP
不会有任何帮助,在传输过程中必须发送
NOOP
,这是
TIdFTP
目前不支持的,但是
NATKeepAlive
实现了同样的功能。并非所有服务器在传输过程中都支持除ABOR以外的命令。这样的不便和细节正是我多年前放弃FTP的原因。它是互联网上最古老的协议之一,甚至在HTTP之前。而且它仍然相当过时。事实上,如果你正在开发某种你计划发行的软件,请注意,你喜欢捕捉Delphi/Indy FTP代码,并杀死进程,假设它是恶意软件。现在的用户不喜欢FTP。防火墙也不例外。它是在安全成为大问题之前设计的。