1

我想编写一个程序来监控一个拥有 80 台设备的网络,这些设备有 IP。我是德尔福程序员。使用 Indy 或 ICS 或任何其他库都没有关系。我想通过 ping(TIdIcmpClient 或 TPing)检查这些设备。我只是在考虑编写线程来分别检查每个设备。但是在这篇文章中Delphi (XE2) Indy (10) Multithread Ping一个自己在 Indy 项目中的专家(Remy Lebeau) 在他的回答中说,Windows 本身正遭受多个实例干扰彼此的回复。他建议使用一个套接字线程,其他线程使用该线程进行 ping。但我认为在这种情况下,它与以串行方式编写此检查相同,也许最好以串行方式编写,因为它不需要检查关键部分。我的问题是,我们不能使用任何方法来 ping 具有依赖线程的多个设备吗?Linux 是否有像Remy Lebeau提到的 windows 一样的问题?

我只是想知道为什么来自多个实例的响应可能会相互干扰。ICMP 是否封装在 IP 中(ICMP_Packet)?如果确实如此,为什么我们不能理解这个回复来自什么来源?如果我们能看到源为什么我们可能会错误地响应?(如果您在下面看到有关 ICMP 数据包的链接,您会看到一个示例,即 ping 命令导致 IP 在它们上很明显的响应。)还有另一件事. 谁处理这个 ICMP?我的意思是当有人 ping 另一台设备时,该设备如何回复 ping 请求?有听众还是什么?当设备 ping 另一个正在等待响应的设备时?ping 是不是一个请求?如果不是,那是什么?最后一件事。如何通过制作数据包并跟踪它来伪造我自己的 ping 请求?

这么多问题。我很困惑。

回答: 是的。但如果您想使用 3rd-party 组件,请不要使用 Indy。它的核心有问题。使用ICS。您可以在这个开源组件包的演示中找到OverbyteIcsPingTst.dproj 。顺便说一句,在Delphi (XE2) Indy (10) Multithread Ping中给出并被提出这个问题的人接受的答案效果不佳!因为它使用了 Indy 并且代码的作者自己在他的代码的 DoPing 函数中评论说:

//We will send here, but if we have recently sent some Pings, we may receive 
//a response to a previous Ping and not get a response to our particular Ping

所以这个单元因为使用 Indy 是不能使用的,如果对你有一个真实的反应很重要!

4

0 回答 0