2012-11-01 38 views
2

客戶端以被動模式定期向服務器TIdFtpServer發送數據。 在一臺客戶端機器中,網絡有時會中斷我收到消息:TIdFtpClient - 處理服務器端的特定錯誤

EIdReplyRFCError:文件狀態正常;即將打開數據連接。

接下來的命令還會拋出如下異常: EIdReplyRFCError:請求的操作異常終止:處理中的本地錯誤。

當任何EIdException apperar然後清除插座,如:

if Assigned(FFtp.IOHandler) then 
begin 
    FFtp.IOHandler.InputBuffer.Clear; 
    FFtp.IOHandler.Close; 
end; 
FFtp.KillDataChannel; 

但是客戶端不能再發送數據,仍然EIdReplyRDCError是投擲,我必須重新啓動服務器FTP。重新啓動後,客戶端重新連接成功並可以發送數據。 在服務器端,我沒有記錄任何未捕獲的異常。

我也試過在服務器端,客戶端殺掉這20分鐘內沒有發送數據:

try 
    T := FFtpServ.Contexts.LockList; 
    for I := 0 to T.Count - 1 do 
    if TIdFtpServerContext(T[I]).Data <> nil then 
    begin 
    Cl := TFtpCl(TIdFtpServerContext(T[I]).Data); 

    Minutes := MinutesBetween(Cl.LastPing, Now); 
    if Minutes >= 20 then 
    begin 
     if(Assigned(TIdFtpServerContext(T[I]).Connection.IOHandler)) then 
     begin 
     TIdFtpServerContext(T[I]).Connection.IOHandler.InputBuffer.Clear; 
     TIdFtpServerContext(T[I]).Connection.IOHandler.Close; 
     end; 
     TIdFtpServerContext(T[I]).KillDataChannel; 
    end; 
    end; 
finally 
    DM.FFtpServ.Contexts.UnLockList; 
end; 

但這種做法往往我AccessViolation例外。

任何想法來解決這個問題?

+0

「我必須重新啓動服務器FTP。」 - 爲什麼?你應該重新啓動連接。斷開客戶端並再次連接。 –

+0

此外,「訪問衝突」是什麼意思?它發生在哪一行?何時訪問該行上的哪個對象?是在閱讀還是在寫作時?什麼是給出的錯誤文本?請不要隱藏您的信息。閱讀http://www.catb.org/esr/faqs/smart-questions.html#code - 這是很棒的常見問題解答 –

回答

0

Contexts.UnLockList之後。我認爲在客戶端池線程異常正在拋出。

如何正確斷開服務器端的指定客戶端?

+0

請勿調用IOHandler.Clear(),IOHandler.Close()或者' Context.KillDataChannel()'在服務器端。讓'TIdFTPServer'處理所有這些。所有你需要做的就是調用'Connection.Disconnect()',僅此而已。 –

0

你所描述的建議FTP通信已經不同步。 TIdFTP正在按錯誤順序處理服務器響應。您可以做的最好的事情就是讓客戶端斷開並重新連接。你不必在服務器端做任何事情。