クライアントは定期的にパッシブ モードでサーバー 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 例外が発生することがよくありました。
この問題を解決するアイデアはありますか?