poco ping线程安全吗?

时间:2019-03-18 09:12:21

标签: c++ multithreading ping poco icmp

我当前正在开发一个应用程序,该应用程序需要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得到了响应(我应该如此),但是即使在该IP地址上没有任何设备,我也从线程2的IP地址2得到了响应!每当收到来自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相同。

有人有什么想法或建议吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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

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