poco ping 线程安全吗

Is poco ping threadsafe

我目前正在开发一款需要 ping 网络设备以检查它们是否在线的应用程序。该应用程序可能需要检查数百台设备,因此我将其设为多线程应用程序。

我遇到的问题是:

我正在 ping 2 个 IP 地址,

  1. 线程 1 - ping IP 地址 1 - 具有有效和现有 IP 地址的 PC
  2. 线程 2 - ping IP 地址 2 - 私有网络上不存在的 IP

我先启动Thread-2。来自此线程的 ping 请求按预期超时(或主机无法访问)。当线程 2 为 运行 时,我会在稍有延迟后启动线程 1。

在线程 1 上,我收到了来自 IP 地址 1 的响应(我应该这样做),但我也在线程 2 上收到了来自 IP 地址 2 的响应,即使该 IP 地址上没有设备!每当收到来自 IP 地址的响应时,就会收到来自 IP 地址 2 的响应。当线程 1 在没有 ping IP 地址 1 的情况下休眠时,线程 2 会按预期产生超时结果。线程 1 和线程 2 之间不共享任何资源,并且每个 ping 都是通过单独的专用 ICMP 客户端对象完成的。

我相信第二个线程正在查看来自 IP 地址 1 的响应,但无法确定它不是来自其自己的 ping 请求的响应,但我不明白为什么会这样。

ping代码与poco-1.9.0/Net/samples/Ping/src/Ping.cpp.

中提供的示例ping.cpp相同

大家有什么想法或建议吗?

谢谢

ICMP 协议中没有任何内容允许网络堆栈确定将哪个 ICMP 数据包路由到哪个接收套接字。您需要为发送的每个数据包添加一个标识符,并进行一些簿记以确保您的代码将其路由到正确的线程。

您有多个可以发送数据包的线程,但您可能只希望一个线程接收数据包并分派到正确的线程或分派到所有线程并让每个线程根据它在添加时添加的标识符来决定它是否相关发送数据包。