【问题标题】:Keeping FTP control connection alive保持 FTP 控制连接处于活动状态
【发布时间】:2011-04-03 23:19:10
【问题描述】:

不久前,我问了一个关于在大型传输期间保持 FTP 会话上的控制连接处于活动状态的问题。虽然我虽然在implementing a solution for a question I'd already asked 之后取得了成功,但似乎 ISP 是问题所在,即它们导致我的控制连接在大传输期间中断。

有趣的是,老式的 FTP 客户端程序“Leap-FTP”通过在下载期间通过控制连接向服务器发送“NOOP”命令来解决此问题。虽然其他流行的客户端在传输过程中死机(Filezilla,我的 Python FTP 脚本),但由于这种解决方法,LeapFTP 运行良好。

我对线程和队列进行了一些研究,但在想出实现这一点的代码时遇到了麻烦。

解决方案似乎很简单(至少在我看来):启动下载,当下载功能运行时,每 n 秒发送一个 NOOP 命令。下载功能完成后停止发送 NOOP 命令。

我希望有人能给我一个关于如何做到这一点的建议。会不会涉及到线程、队列的使用,还是有更简单的解决方案?

底线是,经过大量测试,“NOOP”命令将不得不在大量下载期间发送(发生在高编号 TCP 端口上)。

谢谢!

【问题讨论】:

    标签: multithreading ftp controls


    【解决方案1】:

    为了在单个程序中同时处理多个套接字,您可以使用select 函数代替线程。这取决于您的编程经验,更简单或更复杂。

    我发现线程通常很简单,但是当出现问题时调试确实很痛苦,而使用 select 编写套接字多路复用的代码比线程更复杂但调试难度更低。

    使用select 的基本原理是设置套接字并调用select 函数。它会告诉您哪些套接字已准备好读取或写入。然后你检查时间。如果距离上一次 NOOP 已经 X 秒,请在控制套接字上发送一个。如果传输套接字准备好读取或写入,则处理它。如果控制套接字准备好读取,则读取它并检查 NOOP 响应、错误消息、控制通道正在关闭等。

    【讨论】:

      【解决方案2】:

      由于在这种情况下您并不关心(无论如何)性能,因此最简单的方法可能是为它使用一个单独的线程,它位于一个循环中,只需休眠 N 秒,检查它是否已被取消,然后如果没有,则发送 NOP 并再次休眠。

      【讨论】:

        【解决方案3】:

        如果您在 Unix 上运行,让控制连接程序打开套接字进行传输,然后生成一个新进程进行传输,同样有效。这将使控制程序准备好等待完成、发送 NOOP 命令,甚至在 FTP 服务器支持的情况下开始新的传输。

        这就是原始 FTP 模型应该如何工作的原因,也是它使用控制连接和单独的数据连接而不是控制和数据混合在一起的 HTTP 模型的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-03
          • 2021-09-13
          • 2013-08-27
          • 2019-09-01
          • 2011-07-13
          • 1970-01-01
          • 1970-01-01
          • 2013-01-27
          相关资源
          最近更新 更多