【问题标题】:Network problems while using Indy使用 Indy 时出现网络问题
【发布时间】:2015-04-07 06:08:20
【问题描述】:
function UploadToFTP(file: string ; PathSrv : string): Boolean;
var 
  server, port, user , password: string;
  SR : TSearchRec;
begin
  Result := True;
  FEventLogger := TEventLogger.Create('Upload FTP');
  if file <> '' then
  begin
    try
            server := FServer;
            port := FPort;
            user := FUserName;
            password:= FPassword;
            FindFirst(file, faArchive, SR);
            try   // try except
                idftp1.Host:= server;
                idftp1.Port := StrToInt(port);
                idftp1.Username:= user;
                idftp1.Password:= password;
                idftp1.Connect();
                idftp1.Put(file,PathSrv+SR.Name);
            except on E: Exception do   begin
                Result:= False;
                FEventLogger.LogMessage('Exception : ' + E.Message , EVENTLOG_ERROR_TYPE , 0, 2);
                WriteToLog('Exception: '+ file+' error message: '+  E.Message);
             end;
           end;
    finally

    end;
  end;  
end;

所以我有这个功能,可以在有时慢的网络上将 ftp 上传到一些大文件。我已经在本地对其进行了测试,它工作正常,但是在慢速网络上,我在 99% 的时间里都会遇到这个错误。

The specified network name is no longer available.

这是一个非常奇怪的行为,因为 FTP 位于没有断开连接问题的服务器上。我也尝试观看,它开始上传文件,并且在抛出此错误之前几乎完成了所有上传。因此,例如,如果我有一个 100MB 的文件,它会上传 99MB 的文件然后抛出错误。

任何想法是什么导致了这个错误或我能做什么?

我也时不时出现其他错误

Socket Error # 10054

Connection reset by peer.

要提一下,我尝试使用 filezilla 上传这些文件并且它可以工作,所以问题出在该代码的某个地方,我可能会遗漏一些东西。

【问题讨论】:

  • 您使用哪个 Delphi,或者使用哪个版本的 Indy 更好?我怀疑这可能与某些超时有关,但我想这应该会引发不同的错误。
  • 确保您使用的是具有 TIdFTP.NATKeepAlive 属性的最新版本的 Indy,并在大量传输期间启用它。这将有助于解决由于命令套接字在传输过程中空闲时间过长而导致的超时问题。
  • 该错误消息是系统错误代码 64 ERROR_NETNAME_DELETED。我从未见过 WinSock 的基于 BSD 的套接字 API 报告的错误代码,但我已经看到 WSARecv() 在套接字断开连接期间报告的错误代码。这正是 Microsoft 有时报告丢失连接的方式。错误的时间发生在传输结束时,因为那是下一次TIdFTP 从命令套接字读取(读取服务器的最终响应)。在传输过程中,不会触及命令套接字(因此NATKeepAlive),因此直到传输结束才检测到丢失的连接。
  • 您的应用在哪个操作系统平台上运行? IdleTimeMSIntervalMS 目前仅在 Windows、Linux 和 BSD 上实现。对于其他平台,操作系统会处理超时。对于这些,您必须手动自定义超时(请参阅stackoverflow.com/a/29246519/65863)。您是否尝试使用数据包嗅探器来确保在长传输期间实际发送 TCP 保持活动?
  • @CiucaS:只要是Win2K或更高版本,32bit还是64bit都无所谓。

标签: delphi ftp indy


【解决方案1】:

您使用的是 Symantec Endpoint Protection 还是 KIS (Kaspersky Internet Security)?看看hereherehere

指定的网络名称不再可用。”是由 Symantec Endpoint Protection 11.0 引起的,Symantec 已将此确定为已知问题。

顺便说一句,在您完成文件上传后,不要忘记在您的代码中调用 .Disconnect()。

【讨论】:

  • 我已经避免使用 .Disconnect 来查看这是否是我的代码中的问题......你可以看到最后没有代码行(我在哪里放置了断开连接) .不,我读过,FPT 服务器和客户端机器上都没有 Symantec。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多