TIdFtpClient - 在服务器端处理特定错误

时间:2012-11-01 07:07:49

标签: delphi indy

客户端以被动模式定期向服务器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异常。

有什么想法解决这个问题?

2 个答案:

答案 0 :(得分:0)

在Contexts.UnLockList之后。我认为在客户端池线程中异常就是抛出。

如何在服务器端正确断开指定的客户端?

答案 1 :(得分:0)

您所描述的内容表明FTP通信已失去同步。 TIdFTP正在以错误的顺序处理服务器响应。您可以做的最好的事情就是让客户端断开连接并重新连接。您不必在服务器端执行任何操作。