Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 接收时不发送ICMP回显请求;“无法到达目的地”;小包_Sockets_Icmp - Fatal编程技术网

Sockets 接收时不发送ICMP回显请求;“无法到达目的地”;小包

Sockets 接收时不发送ICMP回显请求;“无法到达目的地”;小包,sockets,icmp,Sockets,Icmp,我正在开发一个网络管理应用程序,该应用程序通过原始BSD套接字()使用ICMP ping托管主机 我的问题不是如何做到这一点,事实上,它工作得很好。当目标主机试图向管理服务器发送ICMP回显请求时,仅当目标主机向管理服务器发送目标无法访问的消息时,我才发现问题 当在管理应用程序中添加主机时,将使用所述ICMP ping对其进行测试,同时启动“发现”,使用相应的协议测试主机上的各种端口,如SNMP(161)等 现在,我意识到在主机上执行“发现”没有多大意义,因为我不知道它是否存在或响应(即它发送了

我正在开发一个网络管理应用程序,该应用程序通过原始BSD套接字()使用ICMP ping托管主机

我的问题不是如何做到这一点,事实上,它工作得很好。当目标主机试图向管理服务器发送ICMP回显请求时,仅当目标主机向管理服务器发送目标无法访问的消息时,我才发现问题

当在管理应用程序中添加主机时,将使用所述ICMP ping对其进行测试,同时启动“发现”,使用相应的协议测试主机上的各种端口,如SNMP(161)等

现在,我意识到在主机上执行“发现”没有多大意义,因为我不知道它是否存在或响应(即它发送了ICMP回送回复),但对于这个问题,这是至关重要的。我们还假设此处讨论的主机实际上是可访问的,并且确实响应ICMP ping,例如通过命令行
ping

“发现”最终导致一些ICMP“Destination unreachable:Port unreachable”数据包被发送回管理服务器,例如,当目标主机上没有运行SNMP代理且端口161实际上无法访问时

这很好,但出于某种原因,这似乎会妨碍ICMP套接字向该主机发送ICMP回显请求,这是ICMP ping所必需的。由于该请求从未发送,因此我的应用程序不会得到任何回复,并且主机在一段时间(超时)后将被视为“无法访问”

我使用Wireshark分析了网络流量,因此我可以看出实际上没有向目标主机发送ICMP回显请求。我使用的应用程序还具有“状态轮询”功能,可用于“手动”在该主机上执行另一个ICMP ping。如果在添加主机后使用此方法(即不再传入目标无法访问的数据包),则发送回显请求时不会出现任何问题

在我上面解释的情况下,ICMP回显请求没有被发送,对此我感到困惑。我有另一个ICMP套接字,它接收所有传入的ICMP数据包(以便对回复作出反应),但它不应该影响发送套接字,对吗?在我的代码中,没有为目标无法到达的消息定义任何反应,它们只是被忽略,因此我非常确定,不是我自己的代码禁用了请求发送

事实上,负责发送请求的
sendto
函数被执行(通过调试确保),甚至返回成功(发送的字节数),但数据包实际上没有被发送。我可以在Windows和Linux系统上复制它,所以我不认为这是任何操作系统问题

禁用导致那些无法到达目的地的消息被发回的“发现”会使一切再次正常工作,因此我相当确定,正是这些消息阻碍了ICMP回显请求的发送。我没有找到答案的一个大问题是:为什么会这样?


如果需要的话,我可以提供更多的信息,但是,恐怕我不允许在这里发布任何代码,因为这是一个商业产品。代码没有什么特别之处,只是使用原始ICMP套接字发送和接收带有
TOS=0
TTL=64
的ICMP(IPv4)数据包。

Dest unreachable由路由器生成,或者如果您在localnet内ping,则由localhost生成

我猜你的观察是因为你正在本地网络中ping。正在生成ICMP-3这一事实意味着ARP查找失败,如果没有ARP查找,您实际上无法发送数据包,因为您不知道目标MAC地址。这解释了一切


因此,无论如何,您应该等待一个固定的时间,比如一秒钟,然后声明主机不在那里,不管是否发送数据包。

ARP查找很好,问题发生在绝对可访问和可用的主机上(即使用
ping
命令行)。我已经使用Wireshark对此进行了分析,可以确认这一点。ICMP-3数据包指为侦听SNMP服务而测试的端口。我非常确定Dest不可访问项不是由localhost生成的,但是它真的是这样的吗,否则,只有路由器才能生成它们?因为如果是这样,它会将目标主机设置为发送方。接收到的ICMP-3数据包的发送方字段中有目标主机,而不是路由器。