IdFTP.QUIT について


フロッガー  2005-05-20 02:47:24  No: 14859  IP: [192.*.*.*]

クライアントソフトを作っています。
サーバーにデータ転送後のやり取りは以下のようにしています。

IdFTP.Put(Fname1,Fname1,false);
if TranseringFlag then IdFTP.Abort;
IdFTP.Quit;

本来転送終了後サーバーから「226」が送られ、
引き続き、クライアントから「QUIT」を送ります。
このとき、サーバーから「221」の応答をうけとるまえに
IdFTP.QUit は無条件のように「Ack+Fin」を送るみたいです。
(思い込みかもしれませんが)
ただ、この場合相手のサーバーは[A]に引き続き[A+F]を送り、
クライアントは[A]を返して正常に終了するので
問題ないのですが、

[QUIT]が送られたあと、タイミングよくサーバーから[A]が
送られた場合、サーバーは次に[221]の応答を返そうとするのですが、
その前にクライアント(IdFTP.Quit)は[A+F]を送ってしまい。
クライアントはその後サーバーから[221]を受け取るのですが、
[Ack+Reset]を返してしまいます。
そこで、サーバーは「221」を受け取ってもらおうと
何度も送ってきますが、パケットモニター上では
クライアントは[R]を返しているようです。

ただ、ホストでは処理が戻ってきているので
次に IdFTP.Connect を実行しにいこうとすると
コネクトエラーになって接続できない状態になります。

何とかならないでしょうか?
よろしくお願いします。

編集    削除
フロッガー  2005-05-20 05:15:18  No: 14860  IP: [192.*.*.*]

自己レスですが、

コンポーネントの中身見てみました。
Quit の中身って以下のようになってました。

procedure TIdFTP.Quit;
begin
  if Connected then begin
    WriteLn('QUIT');      {Do not translate}
  end;
  Disconnect;
end;

で、結局これじゃまずいので IdFTP.Quit の部分を
以下のようにしてみました。
これでいいのでしょうか?

    IdFTP.WriteLn('QUIT');
    if IdFTP.GetResponse([221]) = 221  
      then IdFTP.DisConnect
      else ShowMessage('切断処理に失敗');

編集    削除