2013-06-12 103 views
3

我創建了一個使用Indy TIdIcmpClient對象的Ping函數。它已經完美運行多年。從XE3升級到XE4後,相同的代碼現在會生成錯誤10040(消息太長)。Delphi Indy Ping從XE3升級到XE4後出現錯誤10040

我讀過關於這個錯誤和提出的解決方案的其他帖子,但他們都沒有100%的成功。

我已經減少了數據包大小到32,24,12甚至0,但仍然得到10040錯誤。

我嘗試使用可選參數「緩衝區」,它工作一點點,但偶爾會導致其他異常。

任何人有任何想法如何解決這個問題?

這裏是我的代碼:

function Ping(Host: String;Timeout: Integer;ShowError: Boolean; out ErrorText: String): Boolean; 
var 
    IdIcmpClient1: TIdIcmpClient; 
    Reply: TReplyStatusTypes; 
    ErrorFlag: Boolean; 
    ABuffer: String; 
begin 
    Result:=False; 
    ErrorText:='Success'; 
    ErrorFlag:=False; 
    Reply:=rsEcho; 
    ABuffer:=Host+StringOfChar(' ',255); 
    IdIcmpClient1:=TIdIcmpClient.Create; 
    IdIcmpClient1.PacketSize:=32; 
    IdIcmpClient1.Host:=Host; 
    IdIcmpClient1.ReceiveTimeout:=Timeout; 
    try 
    try 
     IdIcmpClient1.Ping(ABuffer); 
    except 
     on E: Exception do 
     begin 
     ErrorFlag:=True; 
     ErrorText:=E.Message; 
     if ShowError then MessageDlg('Ping Error: '+E.Message, mtWarning, [mbOK], 0); 
     end; 
    end; 
    if not ErrorFlag then 
    begin 
     try 
     Reply:=IdIcmpClient1.ReplyStatus.ReplyStatusType; 
     except 
     on E: Exception do 
     begin 
      ErrorFlag:=True; 
      ErrorText:=E.Message; 
      if ShowError then MessageDlg('Ping Reply Error: '+ErrorText, mtWarning, [mbOK], 0); 
     end; 
     end; 
    end; 
    if not ErrorFlag then 
    begin 
     Result:=Reply=rsEcho; 
     if not Result then 
     begin 
     case Reply of 
      rsEcho: ErrorText:='rsEcho'; 
      rsError: ErrorText:='rsError'; 
      rsTimeOut: ErrorText:='rsTimeOut'; 
      rsErrorUnreachable: ErrorText:='rsErrorUnreachable'; 
      rsErrorTTLExceeded: ErrorText:='rsErrorTTLExceeded'; 
      rsErrorPacketTooBig: ErrorText:='rsErrorPacketTooBig'; 
      rsErrorParameter: ErrorText:='rsErrorParameter'; 
      rsErrorDatagramConversion: ErrorText:='rsErrorDatagramConversion'; 
      rsErrorSecurityFailure: ErrorText:='rsErrorSecurityFailure'; 
      rsSourceQuench: ErrorText:='rsSourceQuench'; 
      rsRedirect: ErrorText:='rsRedirect'; 
      rsTimeStamp: ErrorText:='rsTimeStamp'; 
      rsInfoRequest: ErrorText:='rsInfoRequest'; 
      rsAddressMaskRequest: ErrorText:='rsAddressMaskRequest'; 
      rsTraceRoute: ErrorText:='rsTraceRoute'; 
      rsMobileHostReg: ErrorText:='rsMobileHostReg'; 
      rsMobileHostRedir: ErrorText:='rsMobileHostRedir'; 
      rsIPv6WhereAreYou: ErrorText:='rsIPv6WhereAreYou'; 
      rsIPv6IAmHere: ErrorText:='rsIPv6IAmHere'; 
      rsSKIP: ErrorText:='rsSkip'; 
     else 
      ErrorText:='Unknown'; 
     end; 
     if ShowError then MessageDlg('Ping Error: '+ErrorText, mtWarning, [mbOK], 0); 
     end; 
    end; 
    finally 
    IdIcmpClient1.Free; 
    end; 
end; 

感謝您的時間,

塔德

回答

1

修正了TIdIcmpClient已經在工作,但還沒有被釋放,而我沒有此時此版本的ETA。

+0

嗨雷米。你能給我們一個關於修復的更新嗎? –

+0

我沒有時間去處理它們。 –

+0

@RemyLebeau,現在是2014年2月,我正在使用帶有Indy10 TIdIcmpClient Ping()的C++ Builder XE5,並且此問題仍然存在。你們是否正在研究這個問題或者已經發布了更新/修復? –

1

必須設置ABuffer,例如:

  Host := 'some.server.net'; 
      PacketSize := 24; 
      ReceiveTimeout := 200; 
      ABuffer := Host + StringOfChar(' ', 255); 
      Ping(ABuffer); 

+0

我可以證實,這與IDICMPClient組件一起工作,至少直到雷米和他的團隊發佈他們自己的修復程序。 –

+0

不幸的是,我已經這樣做了(它在上面的代碼中)。這在大多數情況下都有效,但偶爾會導致異常。 –

相關問題