【问题标题】:programming ftp: how to abort file transfer?编程 ftp:如何中止文件传输?
【发布时间】:2011-09-21 09:09:24
【问题描述】:

我正在做小型 ftp 客户端,用于从 ftp 接收一些大文件。我在 RFC 中读到 ABOR 命令对于服务器来说是非常有问题的。即使在通过控制连接发送 ABOR 之后,我看到的几乎所有服务器都只是继续发送数据。关闭数据传输也会导致(在 70% 的测试中)关闭控制连接。服务器只是在我推送 ABOR 数据包后发送 FIN 数据包。 在某个字节处停止接收而不丢失控制连接的最佳方法是什么? FlashFXP 在所有类型的连接延迟和服务器上都可以做到这一点。在调查 tcp 流量时,我发现了标准的 ftp rfc 流量。

但在我的情况下,使用这种技术中止传输仍然没有成功:

1) 关机(passive_socket, SD_BOTH)

2) closesocket(passive_socket);

3) 发送(control_socket,"ABOR\r\n")

4) recv(control_socket) - 停在这里

谢谢

【问题讨论】:

    标签: c++ windows ftp network-programming


    【解决方案1】:

    “ABOR\r\n”命令应作为带外数据发送。如果是 send() -

    send(control_socket, "ABOR\r\n", 6, MSG_OOB);
    

    在您 recv() 代码 426 传输中止后的一段时间。数据连接已关闭。

    如果中止转移无法成功,以下链接更有帮助:http://www.developer.nokia.com/Community/Discussion/showthread.php?134079-Telnet-quot-Interrupt-Process-quot-(IP)-signal-amp-Telnet-quot-Synch-quot

    【讨论】:

    • 我一直在阅读 another question on SO 中有关 OOB 数据的内容,他们还提到此用例是 OOB 数据的典型使用。但是,鉴于它似乎依赖于特定的服务器架构,我对为什么这是必要的(甚至是推荐的)感到困惑。如果服务器正确监听控制连接并处理ABORcommand,它可以关闭数据连接套接字或停止发送,不是吗?
    • @André,描述了带外数据:“紧急数据”通知接收连接,单独的流比主流更重要。因此,它必须首先检查单独的流才能正常处理主流。但在现实世界中,这意味着(我认为)只是发送带有 PSH 设置的数据 TCP 数据包,无论窗口大小或其他内容如何。我也很困惑,因为这仅与我首先找到的 FTP 协议有关。
    • 我了解它的工作原理。但是,如果您尊重来自客户端程序的控制连接状态,那么当ABOR 到达服务器时,服务器端的控制连接输入缓冲区中不应有 anything。如果使用OOB对该命令的解释速度有影响,那么我会理解数据连接停止发送数据的速度更快。但是,使用 OOB 并不能解释在给定 FTP 服务器实现的 any 上它将如何导致 ABOR 命令被解释(VS 根本不像 OP 的情况)。
    • 也许这特定于您要连接的服务器实现。您能说说您使用的是哪个 FTP 服务器吗?
    • 我现在正在使用“FreeBSD vm1 7.4-PRERELEASE FreeBSD”/usr/libexec/ftpd。用于 unix/linux 操作系统的标准 ftp 服务器。但是我没有很好地进行其他测试,所以也许你是对的。我获取的关于 oob 数据的代码来自 /usr/src/usr.sbin/lukemftp(来自 unix/linux 上标准 ftp 客户端的符号链接)。
    【解决方案2】:

    关闭数据传输连接时不应丢失控制连接,它们是两个独立的套接字。也许检查你的代码,看看为什么控制连接被关闭。

    【讨论】:

    • 我检查了几次,在freebsd下,独立的ftpd服务器只是发送FIN数据包,然后当我的客户端想要发送一些东西来控制套接字时,服务器发送RST。
    • 另一种选择是让您的代码在这些断开连接时自动重新连接。我注意到 FileZilla 会这样做。
    • 这是我现在正在做的,但这确实需要很长时间。该代码会干扰 Windows 驱动程序,我不能做这样的延迟。我正在使用此代码发送 ABOR 命令 - sprintf(tb, "%c%c%c%c%cABOR\r\n", 0xff, 0xf4, 0xff, 0xfd, 0x06);如 RFC 中所述,ABOR 命令可能需要特殊处理(代码 ctrl-c)
    • 嗯,问题是当你必须处理你无法控制的其他服务器时,你必须让你的代码符合他们的行为。如果可以的话,也许你应该研究 FTP 以外的东西。
    • 如果目标是性能,我强烈建议不要使用 FTP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多