2011-04-03 159 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響應,錯誤消息,控制通道是否關閉等。