2012-03-28 28 views
4

當我調用該函數IdFtp.List拋出套接字錯誤#10054偶爾

IdFtp.List(myList, '', false); 

事後我已經登錄,改變了FTP目錄,我得到一個套接字錯誤#10054異常(「連接被重置同行「)。

當我調用該函數,例如連續20次我得到這個異常1次。

我只在Vista操作系統上遇到過這個問題。

有人知道問題是什麼或者我可以如何避免它?

+0

我在一個類似的問題由於我的服務器上不支持'FEAT'命令,因此我將'idftp.AutoIssueFEAT'設置爲false,並且問題消失了。但是你從另一個來源得到同樣的問題,不知道你的情況是什麼。 – 2012-11-02 18:26:23

回答

2

FTP協議使用多個套接字連接。每次您撥打List()時,都會建立一個新的套接字連接以傳輸請求的列表數據。聽起來像FTP服務器並不總是在傳輸結束時正確關閉套接字。

+0

奇怪的是,幾乎第一個調用引發異常。我只是檢查了ftp服務器的日誌文件,其他工具如何使用LIST文件(iexplorer,firefox)。一個區別是它們使用PASSIVE模式,然後使用不同的PORT進行數據傳輸。 – 2012-03-29 05:29:53

+0

「PORT」命令用於主動模式傳輸,FTP服務器連接到客戶端。 'PASV'命令用於被動傳輸,客戶端連接到FTP服務器。被動模式傳輸對於客戶端來說更適合防火牆/路由器的使用。 'TIdFTP'具有'Passive'屬性,用於指定使用哪種模式。無論哪種方式,當請求的數據完成傳輸時,FTP服務器會斷開套接字,如果不正確,可能會導致10054錯誤。我會考慮更新Indy以更好地處理這個問題,但我現在沒有ETA。 – 2012-03-29 07:07:54

3

對此可以做的不多,因爲斷開連接是由FTP服務器完成的。 您有幾種選擇:

  • 增加(或禁用)超時設置(每一個FTP服務器有一個不同的名稱)上的FTP服務器連接設置。
  • 定期發送NOOP命令告訴服務器您還活着(切換到被動模式也有幫助)。
  • 捕獲該異常並以無提示方式重新連接(這是我首選的解決方案,因爲我們有許多FTP服務器,並且我不信任系統管理員更改FTP服務器超時設置)。

這裏是FileZilla FTP服務器超時設置的屏幕截圖:

enter image description here

注意,經過以上設置後,FTP客戶端會後的2分鐘斷開非活動。
將該值設置爲0將禁用超時。

+0

在我的機器和其他大多數客戶端上工作沒有任何問題(因此我不能重現)。我認爲這取決於客戶端機器。 – 2012-03-29 05:31:47

0

在組件 「IdFTP」,更改以下屬性:

  • 「被動」= 「假」
  • 「以TransferType」= 「ftASCII」