Delphi Indy Ping错误10040

HpT*_*erm 5 delphi ping indy10

我有一小段代码通过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;
Run Code Online (Sandbox Code Playgroud)

所以我已经在家里开发了我的wifi网络,并且工作正常.

当我重新开始工作时,我进行了测试,并且收到错误消息

Socket Errod # 10040 Message too long
Run Code Online (Sandbox Code Playgroud)

在工作中我们有固定的IP和所有的计算机,我在同一个子网中.

我试图断开与固定IP的连接并连接到wifi当然是DHCP而不是在同一个子网中,它只是工作正常.

我试过在互联网上搜索此错误以及如何解决它但没有找到太多信息.

当然我已经尝试将默认缓冲区大小更改为更大的值,但它没有改变任何东西我仍然在同一子网内的固定IP上得到错误.

此外,我不知道这是否有助于找到解决方案,但我的代码处理异常,但在这种情况下,提高错误大约需要3-4秒,而Timeout设置为200毫秒.而且我不能等待每一次ping.

顺便说一句,我使用delphi 2010,我认为它是indy 10.我也测试了XE2但是同样的错误.

任何的想法

-----编辑-----

这个问题得到了解答,现在我尝试在多线程中运行这个问题,我又问了另一个问题: Delphi(XE2)Indy(10)Multithread Ping

LaK*_*ven 6

将该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;
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,"PacketSize"属性的默认值将在未来的Indy更新中减少以解决此问题. (5认同)
  • 对于`PacketSize`,默认设置为1024.无论你传递给`Ping()`的什么数据(在这种情况下都没有)都用来填充"PacketSize"在ICMP数据包中保留的空间.如果没有数据,则仍然在数据包中保留空间.因此减少`PacketSize`会减小ICMP数据包的总体大小.较小的ICMP数据包更适合网络数据包,因此更易于路由. (2认同)