2011-04-03 106 views
1

前一段时间,我问了一个关于在大量传输期间保持FTP会话上的控制连接处于活动状态的问题。尽管我已经在implementing a solution for a question I'd already asked之后取得了成功,但看起来好像ISP是问题所在,即它们导致我的控制连接在大量传输期间死亡。使FTP控制连接保持活动状态

有趣的是,老派的FTP客户端程序“Leap-FTP”只需在下载过程中向控制连接上的服务器发送“NOOP”命令即可解决此问题。当其他受欢迎的客户端在传输过程中死亡(Filezilla,我的Python FTP脚本)时,由于此解决方法,LeapFTP运行良好。

我已经对线程和队列进行了一些研究,但是遇到麻烦提出了代码来做到这一点。

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

我希望有人可以给我一个建议,说明如何做到这一点。它会涉及使用线程,队列还是有更简单的解决方案?底线是,经过大量测试后,'NOOP'命令将不得不在大量下载(发生在高编号的TCP端口上)期间发送。

谢谢!

回答

0

因为在这种情况下你不关心性能,所以最好使用一个单独的线程,它在循环中只需要睡N秒,检查它是否被取消,如果不发送NOP并再次睡觉。

0

如果您在Unix上运行,控制连接程序打开套接字进行传输,然后产生一个新的进程来完成传输,效率会更高。这将使控制程序准备好等待完成,发送NOOP命令,或者甚至在FTP服务器可以支持的情况下启动新的传输。

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

0

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

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

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

相关问题