我有一小段代码通过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;