【问题标题】:Using threading to keep FTP control port alive使用线程保持 FTP 控制端口处于活动状态
【发布时间】:2011-07-13 05:52:49
【问题描述】:

我的 FTP 下载脚本(基于 ftplib)在大量下载时挂起。我正在使用的远程服务器,虽然高度可配置(proftpd)无法通过远程网络施加的防火墙限制。

我在公司仅限使用被动模式,即 IT 不会为我打开端口以允许 FTP 主动模式。

所以,我陷入了被动模式。

远程服务器会在 10 到 15 分钟后断开连接以进行大型下载。

我需要在大下载期间保持控制连接处于活动状态。我应该使用线程,每十秒发送一个“NOOP”命令吗?如果是这样,您好心人会给我一些可以解决问题的示例代码吗?我需要将多个值传递给我的 FTP 下载功能。 keepalive 函数不需要传递任何参数。

或者,有没有办法控制我在端口 21(控制连接)上使用的特定套接字,以在端口 nnnnnn 上进行大量下载时使其保持活动状态?

非常感谢!

【问题讨论】:

    标签: python multithreading sockets ftp


    【解决方案1】:

    您也可以尝试使用 TCP KeepAlive 功能 通过添加此代码:

    import socket
    ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
    

    TCP KeepAlive 的支持高度依赖于平台和防火墙 - 因此不能保证,但它是为此目的而设计的,它比添加额外的线程要简单得多。您在哪些平台上工作?

    【讨论】:

    • 感谢您的建议!远程盒子是一个运行 Linux 的 NAS。我的盒子是XP;它运行脚本,将远程数据放到公司的服务器上。在对您的建议进行更多研究后,我一定会尝试一下。我有一种感觉,这与更细粒度的套接字控制有关。
    • 您的建议成功了!非常感谢!我现在可以在身份验证期间使用 SSH 隧道实现密码保护。这仅在 proftpd 的被动模式下允许,所以我很高兴您的代码建议允许这种情况发生。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多