0

さて、私はマルチスレッド FTP サーバーを作成しており、現在、データ転送の中止を実装しようとしています。これは、データ転送の中止を管理するコードの一部です。

ABORCommand(); //sends message with code 226 (1st message)
pthread_join(threads, &ret);  //waits for the thread processing data transfer

sprintf(buffer, "226 Transfer complete - %d bytes copied.\r\n", data_comm->num_bytes);
Send(); //this just sends the message in buffer to the client (2nd message)
WriteToLog("transfer complete", "226");

close(data_comm->clie_sock);   //closes the data connection
delete data_comm;  //this deletes instance of the class taking care of data transfer
  1. 私の問題は、私がテストしている 2 つのクライアント (Nautilus と gftp クライアント) が、データ転送を中止するときに異なる動作をすることです。
  2. 私が達成しようとしているのは、さまざまなクライアントを使用してエラーなしでデータ転送プロセスを中止できるようにすることです。
  3. クライアントの動作は、私がクライアントに送信するメッセージによって異なります。
  4. Nautilus で転送を中止すると、問題なく動作し、エラーもリークもありません。しかし、gftp クライアントでは、クライアントは最初のメッセージを受信して​​から制御接続を閉じます。次に、サーバーは 2 番目のメッセージをクライアントに送信します。その後、サーバーはクライアントから何かを受信することになっていますが、それが発生するとエラーが発生し、大量のメモリリークが発生します。閉じたソケットから読み取るとエラーが発生することはわかっていますが、プログラム全体がクラッシュすることはありません。
  5. 私はgftpクライアントで中止を機能させようとしましたが、唯一の(部分的な)解決策は2番目のメッセージのみを送信することでした(まあ、どちらを送信しても、そのうちの1つだけを送信することは問題ではないと思います)。その後、エラーは発生せず、メモリリークもありませんでした。残された唯一の問題は、クライアントがまだ制御接続を閉じていたことです。クライアントが明らかに切断されたため(gftpクライアントでさえ「サイトのローカルホストから切断中」と書いた)、サーバーは最後に接続を閉じましたが、サーバーが閉じた後、gftpは「エラー:リモートサイトのローカルホストが切断されました。30で再接続します秒」。
  6. ただし、このソリューションには副作用がありました。Nautilus クライアントが動作を停止しました。クライアントはメッセージを受け取りましたが、私が彼にメッセージを 1 つだけ送信したため、別のメッセージを待っていました (またはそう思う)。
  7. 私の質問は、両方のクライアントで機能させるにはどうすればよいですか? 私が持っている唯一の考えは、返信コードが間違っている可能性があるということです。どこに問題があるのか​​教えてください。

ありがとう

4

1 に答える 1