[英]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.