簡體   English   中英

Delphi Indy Ping錯誤10040

[英]Delphi Indy Ping Error 10040

我有一小段代碼通過ping它來檢查計算機是否處於活動狀態。 我們用一個有40台電腦的房間,我想通過我的程序遠程檢查哪個還活着。

因此我用indy編寫了一個小ping函數

function TMainForm.Ping(const AHost : string) : Boolean;
var
  MyIdIcmpClient : TIdIcmpClient;
begin
  Result := True;

  MyIdIcmpClient := TIdIcmpClient.Create(nil);
  MyIdIcmpClient.ReceiveTimeout := 200;
  MyIdIcmpClient.Host := AHost;

  try
    MyIdIcmpClient.Ping;
    Application.ProcessMessages;
  except
    Result := False;
    MyIdIcmpClient.Free;
    Exit;
  end;
  if MyIdIcmpClient.ReplyStatus.ReplyStatusType <> rsEcho Then result := False;

  MyIdIcmpClient.Free;
end;

所以我已經在家里開發了我的wifi網絡,並且工作正常。

當我重新開始工作時,我進行了測試,並且收到錯誤消息

Socket Errod # 10040 Message too long

在工作中我們有固定的IP和所有的計算機,我在同一個子網中。

我試圖斷開與固定IP的連接並連接到wifi當然是DHCP而不是在同一個子網中,它只是工作正常。

我試過在互聯網上搜索此錯誤以及如何解決它但沒有找到太多信息。

當然我已經嘗試將默認緩沖區大小更改為更大的值,但它沒有改變任何東西我仍然在同一子網內的固定IP上得到錯誤。

此外,我不知道這是否有助於找到解決方案,但我的代碼處理異常,但在這種情況下,提高錯誤大約需要3-4秒,而Timeout設置為200毫秒。 而且我不能等待每一次ping。

順便說一句,我使用delphi 2010,我認為它是indy 10.我也測試了XE2但是同樣的錯誤。

任何的想法

-----編輯-----

這個問題得到了解答,現在我嘗試在多線程中運行這個問題,我又問了另一個問題: Delphi(XE2)Indy(10)Multithread Ping

PacketSize屬性設置為24

function TMainForm.Ping(const AHost : string) : Boolean;
var
  MyIdIcmpClient : TIdIcmpClient;
begin
  Result := True;

  MyIdIcmpClient := TIdIcmpClient.Create(self);
  MyIdIcmpClient.ReceiveTimeout := 200;
  MyIdIcmpClient.Host := AHost;
  MyIdIcmpClient.PacketSize := 24;
  MyIdIcmpClient.Protocol := 1;
  MyIdIcmpClient.IPVersion := Id_IPv4;

  try
    MyIdIcmpClient.Ping;
    // Application.ProcessMessages; // There's no need to call this!
  except
    Result := False;
    Exit;
  end;
  if MyIdIcmpClient.ReplyStatus.ReplyStatusType <> rsEcho Then result := False;

  MyIdIcmpClient.Free;
end;

對於XE5和Indy10,即使使用不同的數據包大小,這仍然是一個問題。

要回答更加密碼的修復:

ABuffer := MyIdIcmpClient1.Host + StringOfChar(' ', 255);

這是一個“神奇”的解決方案,可以解決Indy10組件中存在錯誤的事實(如果我已經了解了Remy Lebeau的話)。

我的推測是,它與接收緩沖區的大小有一些聯系。 為了測試我的理論,我可以使用任何字符,根本不需要包含主機地址。 僅使用接收緩沖區所需的字符數。 我使用這個小代碼(C ++ Builder XE5)非常成功地執行Ping(所有其他值都是默認值):

AnsiString Proxy = StringOfChar('X',IcmpClient->PacketSize);

IcmpClient->Host = Host_Edit->Text;
IcmpClient->Ping(Proxy);

如您所見,我創建了一個與PacketSize屬性長度相同的字符串。 你填的是微不足道的。

也許這可以幫助@RemyLebeau解決問題。

使用此代碼

ABuffer:= MyIdIcmpClient1.Host + StringOfChar('',255);

MyIdIcmpClient.Ping(ABuffer);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM