我有一小段代码,通过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;
我在家里的Wi-Fi网络上开发了这个程序,一切都很顺利。
当我回到工作时进行测试时,出现了一个错误提示。
Socket Errod # 10040 Message too long
在工作中,我们有固定的IP地址,所有电脑和我都在同一子网内。
我尝试断开固定IP连接并连接到Wi-Fi,当然是DHCP,不在同一子网内,这样就可以正常工作。
我尝试在互联网上搜索此错误以及如何解决它,但没有找到太多信息。
当然,我已经尝试将默认缓冲区大小更改为较大的值,但仍然在相同子网中使用固定IP时出现错误。
此外,我不知道这是否有助于找到解决方案,但我的代码处理异常,在这种情况下,需要大约3-4秒才能引发错误,而超时设置为200毫秒。我无法在每个ping上等待那么长时间。
顺便说一下,我使用delphi 2010,我认为它是indy 10。我也在XE2上进行了测试,但出现了相同的错误。
有任何想法吗?
----- 编辑 -----
这个问题已经得到解答,现在我想尝试在多线程中运行它,并为此提出了另一个问题。 Delphi (XE2) Indy (10) 多线程 Ping