Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 保持FTP控制连接处于活动状态_Multithreading_Ftp_Controls - Fatal编程技术网

Multithreading 保持FTP控制连接处于活动状态

Multithreading 保持FTP控制连接处于活动状态,multithreading,ftp,controls,Multithreading,Ftp,Controls,前一段时间,我问了一个关于在大型传输期间保持FTP会话上的控制连接处于活动状态的问题。虽然我认为我在之后取得了成功,但似乎ISP是问题所在,也就是说,它们导致我的控制连接在大传输过程中死亡 有趣的是,老式的FTP客户端程序“Leap FTP”通过在下载过程中通过控制连接向服务器发送“NOOP”命令来解决这个问题。当其他流行的客户端在传输过程中死亡时(Filezilla,我的Python FTP脚本),LeapFTP由于这种解决方法而运行得很好 我已经对线程和队列做了一些研究,但是我很难找到实现这

前一段时间,我问了一个关于在大型传输期间保持FTP会话上的控制连接处于活动状态的问题。虽然我认为我在之后取得了成功,但似乎ISP是问题所在,也就是说,它们导致我的控制连接在大传输过程中死亡

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

我已经对线程和队列做了一些研究,但是我很难找到实现这一点的代码

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

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

底线是,经过大量测试后,“NOOP”命令必须在大量下载期间发送(在编号较高的TCP端口上进行)


谢谢

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

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

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


这就是最初的FTP模型的工作原理,也是它使用控制连接和独立数据连接而不是控制和数据混合在一起的HTTP模型的原因。

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


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

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

我发现线程通常很简单,但当调试出问题时,这是一件非常痛苦的事情,而使用
select
编写套接字多路复用代码比线程更复杂,但调试难度更小


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

为了在单个程序中一次处理多个套接字,可以使用
选择功能而不是线程。这可能更简单,也可能更复杂,这取决于您的编程经验

我发现线程通常很简单,但当调试出问题时,这是一件非常痛苦的事情,而使用
select
编写套接字多路复用代码比线程更复杂,但调试难度更小

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