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

谢谢

4

1 回答 1

0

好的,首先你是真的:

我得到一个错误和大量的内存泄漏。我知道从关闭的套接字读取会出错,但它不应该使整个程序崩溃

所以是的:

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

而且,一般来说:

  • 您的服务器永远不应期望客户端行为正确。相反,它应该假设客户端是错误的甚至是敌对的(安全性)。因此,如果客户不回答,您应该有超时。
  • 如果客户不遵守规范但仍然可以工作(大市场份额),那么您必须找到一种方法来识别该客户并采取相应的行动。

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

于 2013-06-10T15:02:52.877 回答