クライアントソフトを作っています。
サーバーにデータ転送後のやり取りは以下のようにしています。
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 を実行しにいこうとすると
コネクトエラーになって接続できない状態になります。
何とかならないでしょうか?
よろしくお願いします。
自己レスですが、
コンポーネントの中身見てみました。
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('切断処理に失敗');