當我調用該函數IdFtp.List拋出套接字錯誤#10054偶爾
IdFtp.List(myList, '', false);
事後我已經登錄,改變了FTP目錄,我得到一個套接字錯誤#10054異常(「連接被重置同行「)。
當我調用該函數,例如連續20次我得到這個異常1次。
我只在Vista操作系統上遇到過這個問題。
有人知道問題是什麼或者我可以如何避免它?
當我調用該函數IdFtp.List拋出套接字錯誤#10054偶爾
IdFtp.List(myList, '', false);
事後我已經登錄,改變了FTP目錄,我得到一個套接字錯誤#10054異常(「連接被重置同行「)。
當我調用該函數,例如連續20次我得到這個異常1次。
我只在Vista操作系統上遇到過這個問題。
有人知道問題是什麼或者我可以如何避免它?
FTP協議使用多個套接字連接。每次您撥打List()
時,都會建立一個新的套接字連接以傳輸請求的列表數據。聽起來像FTP服務器並不總是在傳輸結束時正確關閉套接字。
奇怪的是,幾乎第一個調用引發異常。我只是檢查了ftp服務器的日誌文件,其他工具如何使用LIST文件(iexplorer,firefox)。一個區別是它們使用PASSIVE模式,然後使用不同的PORT進行數據傳輸。 – 2012-03-29 05:29:53
「PORT」命令用於主動模式傳輸,FTP服務器連接到客戶端。 'PASV'命令用於被動傳輸,客戶端連接到FTP服務器。被動模式傳輸對於客戶端來說更適合防火牆/路由器的使用。 'TIdFTP'具有'Passive'屬性,用於指定使用哪種模式。無論哪種方式,當請求的數據完成傳輸時,FTP服務器會斷開套接字,如果不正確,可能會導致10054錯誤。我會考慮更新Indy以更好地處理這個問題,但我現在沒有ETA。 – 2012-03-29 07:07:54
對此可以做的不多,因爲斷開連接是由FTP服務器完成的。 您有幾種選擇:
NOOP
命令告訴服務器您還活着(切換到被動模式也有幫助)。這裏是FileZilla
FTP服務器超時設置的屏幕截圖:
注意,經過以上設置後,FTP客戶端會後的2分鐘斷開非活動。
將該值設置爲0將禁用超時。
在我的機器和其他大多數客戶端上工作沒有任何問題(因此我不能重現)。我認爲這取決於客戶端機器。 – 2012-03-29 05:31:47
在組件 「IdFTP」,更改以下屬性:
我在一個類似的問題由於我的服務器上不支持'FEAT'命令,因此我將'idftp.AutoIssueFEAT'設置爲false,並且問題消失了。但是你從另一個來源得到同樣的問題,不知道你的情況是什麼。 – 2012-11-02 18:26:23