首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Delphi Indy Ping错误10040

Delphi Indy Ping错误10040
EN

Stack Overflow用户
提问于 2012-10-04 16:18:05
回答 2查看 14.8K关注 0票数 5

我有一小段代码,可以通过pinging来检查计算机是否处于活动状态。我们曾经有一个房间,有40台电脑,我想通过我的程序远程检查,我的程序是活的。

因此,我使用indy编写了一个小ping函数

代码语言:javascript
复制
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网络上开发了它,一切都运行得很好。

当我回到工作岗位时,我测试了一下,我得到了一个错误消息:

代码语言:javascript
复制
Socket Errod # 10040 Message too long

在工作中,我们有固定的in地址,所有的计算机和我都在同一子网中。

我尝试断开与固定IP的连接,并连接到wifi,这当然是DHCP,并且不在同一子网中,它工作得很好。

我试着在互联网上搜索这个错误以及如何解决它,但没有找到太多信息。

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

此外,我不知道这是否有助于找到解决方案,但我的代码处理异常,但在这种情况下,它需要大约3-4秒来引发错误,而超时设置为200毫秒。我不能在每个ping上等待那么长时间。

顺便说一下,我使用的是Delphi2010,我认为它是Indy10。我也在XE2上测试过,但同样的错误。

有什么想法吗?

编辑--

这个问题已经回答了,现在我尝试让它在多线程中运行,并且我已经向 Delphi (XE2) Indy (10) Multithread Ping提出了另一个问题

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 17:03:31

PacketSize属性设置为24

代码语言:javascript
复制
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;
票数 7
EN

Stack Overflow用户

发布于 2014-02-10 11:10:38

对于XE5和Indy10,即使数据包大小不同,这仍然是一个问题。

要回答更具加密色彩的问题:

代码语言:javascript
复制
ABuffer := MyIdIcmpClient1.Host + StringOfChar(' ', 255);

这是一个“神奇的”修复,可以绕过Indy10组件中存在错误的事实(如果我对Remy Lebeau的理解正确的话)。

我的猜测是,这与接收缓冲区的大小有关。为了测试我的理论,我可以使用任何字符,并且根本不需要包括主机地址。只使用接收缓冲区所需的字符数。我使用这个小代码(C++生成器XE5)成功地执行了Ping操作(所有其他值都是默认值):

代码语言:javascript
复制
AnsiString Proxy = StringOfChar('X',IcmpClient->PacketSize);

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

如您所见,我创建了一个长度与PacketSize属性相同的字符串。你填充的东西是微不足道的。

也许这对@RemyLebeau在修复时会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12723081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档