保持FTP控制连接活着

时间:2011-04-03 23:19:11

标签: multithreading ftp controls

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

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

我已经对线程和队列进行了一些研究,但是我无法想出能够实现这一目标的代码。

解决方案看起来很简单(至少在我脑海中):启动下载,同时运行下载功能,每隔n秒发送一次NOOP命令。下载功能完成后停止发送NOOP命令。

我希望有人可以就如何做到这一点给我一个建议。它是否涉及使用线程,队列,还是有更简单的解决方案?

经过大量测试后,底线是大量下载(在高编号TCP端口上发生)时必须发送'NOOP'命令。

谢谢!

3 个答案:

答案 0 :(得分:0)

因为在这种情况下你不关心(很多,无论如何)关于性能,所以最简单的方法是使用一个单独的线程,它在一个循环中只是睡眠N秒,检查它是否被取消,以及如果没有发送NOP并再次睡觉。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为了在单个程序中一次处理多个套接字,您可以使用select函数而不是线程。根据您的编程经验,这可能更简单也更复杂。

我发现线程通常很简单,但是当调试出错时,这是一个真正的痛苦,而使用select编写套接字多路复用的代码比使用线程更复杂但调试更困难。

使用select的基础是设置套接字并调用select函数。它会告诉您哪些插槽可以读取或写入。然后你检查时间。如果距您上次的NOOP为X秒,请在控制插座上发送一个。如果传输套接字已准备好进行读取或写入,请对其进行处理。如果控制插座已准备好读取,请读取它并检查NOOP响应,错误消息,控制通道是否关闭等。