68user's page 掲示板

Prev< No. 3750> Next  [最新発言に戻る] [過去ログ一覧]
No. 3750 # 金床 2004/06/05 (土) 06:10:55
>>3746 68user
興味があったので調べてみました。

現状のftp-client.cはデータコネクションでのデータ転送終了時にソケットのcloseを行っていないため、
サーバー側からのFIN-ACKパケットに対してFIN-ACKを送り返しません。

このため、データコネクションの切断について、クライアントからのFIN-ACKパケットを待つProFTPDと、
FIN-ACKパケットを特に待たない他のFTPDとの実装の差が、今回の問題であるプログラムの動作の差になっている
ようです。

>データコネクションはサーバ側から切ってくれると認識していたのですが、間違いなのかもしれません。
データコネクションの切断はサーバー側から行います。原理的に考えても、ファイルやファイルリストのサイズを
送信前に調べることはできませんので、これは間違いありません。

「サーバー側から切断」とはつまりサーバー側からFIN-ACKパケットが送信されるということです。
この際にreadが0を返すので、プログラムはwhileループを抜けます。
ここにclose(data_socket);を追加するとFIN-ACKを返信するようになり、ProFTPDはデータコネクションの切断が
正常に行われたと考え、処理が進みます。

つまり、close(data_socket);を追加することは「切断をクライアント側から行う」ことにはなりません。

以上、まとまりがなく申し訳ありませんが、参考になれば幸いです。

Prev< No. 3750> Next  [最新発言に戻る] [過去ログ一覧]