使用线程保持FTP控制端口活跃
我写的FTP下载脚本(用的是ftplib)在下载大文件的时候总是卡住。我要用的远程服务器虽然可以调很多设置(是proftpd),但它无法突破远程网络的防火墙限制。
在我公司,我只能用被动模式,也就是说,IT部门不会为我打开端口来允许使用FTP的主动模式。
所以,我只能用被动模式。
在下载大文件的时候,远程服务器会在10到15分钟后断开连接。
我需要在大文件下载的时候保持控制连接不断。请问我应该用线程,每十秒发送一个'NOOP'命令来保持连接吗?如果可以的话,能不能给我一些示例代码来实现这个功能?我需要传多个值给我的FTP下载函数,而保持连接的函数不需要传参数。
或者,有没有办法控制我在21端口(控制连接)上使用的特定套接字,以便在大文件下载时保持它的连接,而下载是在其他端口nnnnnn上进行的?
非常感谢!
1 个回答
8
你也可以尝试使用TCP的KeepAlive功能,方法是添加以下代码:
import socket
ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
TCP的KeepAlive功能在不同的平台和防火墙上支持情况不一样,所以不能保证一定有效。不过这个功能就是为了这个目的设计的,使用起来比添加一个额外的线程要简单很多。你是在什么平台上工作呢?