我目前正在开发一个应用程序,它需要ping网络设备来检查它们是否在线。这个应用程序可能需要检查几百个设备,所以我已经把它变成了一个多线程应用程序。
我遇到的问题是:
我在敲两个IP地址,
我先启动线程-2。来自此线程超时(或主机不可达)的ping请求按预期进行。当Thread 2正在运行时,我在稍微延迟之后启动Thread 1。
在Thread 1上,我得到来自IP地址1的响应(正如我应该的那样),但是我也从Thread 2上的IP地址2得到响应,即使在这个IP地址上没有设备!当收到来自IP地址的响应时,接收来自IP地址2的响应。当线程1睡眠时,没有发出IP地址1,线程2就会产生预期的超时结果。线程1和线程2之间没有资源共享,每个ping都是通过一个专用的ICMP客户端对象完成的。
我相信第二个线程看到的是来自IP地址1的响应,而不是它自己的ping请求的响应,但我不知道为什么会发生这种情况。
ping代码与poco-1.9.0/Net/ ping.cpp /Ping/src/Ping.src中提供的示例相同。
有人有什么想法或建议吗?
谢谢
发布于 2019-03-18 10:12:18
ICMP协议中没有允许网络堆栈确定哪个ICMP数据包路由到哪个接收套接字的内容。您需要在发送的每个数据包中添加一个标识符,并进行一些簿记,以确保代码将其路由到正确的线程。
您有可以发送数据包的多个线程,但是您可能只需要一个线程接收数据包并将其分派到正确的线程或分派给所有线程,并让每个线程根据它在发送数据包时添加的标识符来决定是否相关。
https://stackoverflow.com/questions/55217875
复制相似问题