好吧,我正在编写一个多线程 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
- 我的问题是我正在测试的两个客户端(Nautilus 和 gftp 客户端)在中止数据传输时表现不同。
- 我想要实现的是能够使用不同的客户端无错误地中止数据传输过程。
- 客户的行为取决于我发送给他们的消息。
- 当我用 Nautilus 中止传输时,它工作正常,没有错误,没有泄漏。但是对于 gftp 客户端,客户端会收到第一条消息,然后关闭控制连接。然后服务器将第二条消息发送给客户端。在那之后,服务器应该从客户端接收一些东西,但是当它发生时,我得到一个错误并且大量的内存泄漏。我知道从关闭的套接字读取会出错,但它不应该使整个程序崩溃。
- 我试图让 gftp 客户端的流产工作,唯一的(部分)解决方案是只发送第二条消息(嗯,我认为我发送的重点是只发送其中一个并不重要)。之后我没有收到任何错误,也没有内存泄漏。剩下的唯一问题是客户端仍然关闭了控制连接。然后服务器关闭了连接,因为客户端显然已断开连接(甚至 gftp 客户端也写了“与站点 localhost 断开连接”),但是在服务器关闭它后,gftp 写入“错误:远程站点 localhost 已断开连接。将在 30 后重新连接秒”。
- 然而,该解决方案有副作用。Nautilus 客户端停止工作。客户收到了消息,但仍在等待另一条消息(或者我认为是这样),因为我只给他发送了一条消息。
- 我的问题是如何使它对两个客户都有效?我唯一的想法是回复代码可能是错误的。请告诉我问题出在哪里。
谢谢