在ftp服务器上中止数据传输时的客户端行为

时间:2013-06-10 09:52:22

标签: c++ memory-leaks ftp-client abort ftp-server

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

1 个答案:

答案 0 :(得分:0)

好的,首先你是真的:

  

我收到错误和大量内存泄漏。我知道从封闭套接字读取会产生错误,但它不会导致整个程序崩溃

是的:

  • 你应该抵制错误:系统地检查返回代码并正确处理它们
  • 您不应该有内存泄漏:使用智能指针以释放未使用的内存块

而且,一般来说:

  • 您的服务器永远不要指望客户端行为正常。相反,它应该假设客户是错误的甚至是敌对的(安全)。如果客户没有回答,你应该有超时。
  • 如果客户不遵守规范但仍然有效(市场份额很大),那么你必须找到一种方法来识别这个客户并做出相应的行为。

在那之后,我不太了解你的问题。所以请看我的评论,我会更新这个答案。