2

クライアントは定期的にパッシブ モードでサーバー TIdFtpServer にデータを送信します。あるクライアント マシンで、ネットワークが切断されることがあります。次のメッセージが表示されます。

EIdReplyRFCError : ファイル ステータスは正常です。データ接続を開こうとしています。

そして、次のコマンドも次のような例外をスローします: EIdReplyRFCError : Requested action aborted: local error in processing.

EIdException が表示されたら、次のようにソケットをクリアします。

if Assigned(FFtp.IOHandler) then
begin
  FFtp.IOHandler.InputBuffer.Clear;
  FFtp.IOHandler.Close;
end;
FFtp.KillDataChannel;

しかし、クライアントはデータを送信できなくなりました。それでも EIdReplyRDCError がスローされ、サーバー 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 例外が発生することがよくありました。

この問題を解決するアイデアはありますか?

4

2 に答える 2

0

あなたの説明は、FTP 通信が同期していないことを示唆しています。 TIdFTPサーバーの応答を間違った順序で処理しています。最善の方法は、クライアントを切断して再接続することです。サーバー側で何もする必要はありません。

于 2012-11-01T20:45:28.727 に答える
0

Contexts.UnLockList の後。クライアントプールスレッドで例外がスローされていると思います。

サーバー側で指定されたクライアントをどのように適切に切断しますか?

于 2012-11-01T10:26:41.583 に答える