客户端以被动模式定期向服务器TIdFtpServer发送数据。 在一台客户端机器中,网络有时会中断,我得到了消息:
EIdReplyRFCError:档案状态还可以;即将开放数据连接。
下一个命令也会抛出异常,如: EIdReplyRFCError:请求的操作已中止:处理中的本地错误。
当任何EIdException apperar然后清除套接字时:
if Assigned(FFtp.IOHandler) then
begin
FFtp.IOHandler.InputBuffer.Clear;
FFtp.IOHandler.Close;
end;
FFtp.KillDataChannel;
但客户端无法再发送数据,仍然是EIdReplyRDCError正在抛出,我必须重新启动Server FTP。重新启动后,客户端成功重新连接并可以发送数据。 在服务器端,我没有记录任何未捕获的异常。
我也尝试在服务器端,杀死没有在20分钟内发送数据的客户端:
try
T := FFtpServ.Contexts.LockList;
for I := 0 to T.Count - 1 do
if TIdFtpServerContext(T[I]).Data <> nil then
begin
Cl := TFtpCl(TIdFtpServerContext(T[I]).Data);
Minutes := MinutesBetween(Cl.LastPing, Now);
if Minutes >= 20 then
begin
if(Assigned(TIdFtpServerContext(T[I]).Connection.IOHandler)) then
begin
TIdFtpServerContext(T[I]).Connection.IOHandler.InputBuffer.Clear;
TIdFtpServerContext(T[I]).Connection.IOHandler.Close;
end;
TIdFtpServerContext(T[I]).KillDataChannel;
end;
end;
finally
DM.FFtpServ.Contexts.UnLockList;
end;
但是在这种方法中,我常常遇到AccessViolation异常。
有什么想法解决这个问题?
答案 0 :(得分:0)
在Contexts.UnLockList之后。我认为在客户端池线程中异常就是抛出。
如何在服务器端正确断开指定的客户端?
答案 1 :(得分:0)
您所描述的内容表明FTP通信已失去同步。 TIdFTP
正在以错误的顺序处理服务器响应。您可以做的最好的事情就是让客户端断开连接并重新连接。您不必在服务器端执行任何操作。