【发布时间】: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),因此直到传输结束才检测到丢失的连接。 -
您的应用在哪个操作系统平台上运行?
IdleTimeMS和IntervalMS目前仅在 Windows、Linux 和 BSD 上实现。对于其他平台,操作系统会处理超时。对于这些,您必须手动自定义超时(请参阅stackoverflow.com/a/29246519/65863)。您是否尝试使用数据包嗅探器来确保在长传输期间实际发送 TCP 保持活动? -
@CiucaS:只要是Win2K或更高版本,32bit还是64bit都无所谓。