poco ping线程是否安全

问题描述 投票:0回答:1

我目前正在开发一个应用程序,需要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相同。

任何人有任何想法或建议吗?

谢谢

c++ multithreading ping poco icmp
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.