gpt4 book ai didi

c - 为什么 ping 会收到另一个 ping 命令包?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:37 27 4
gpt4 key购买 nike

我正在学习 C 中的 ping 实现。问题是,我使用原始套接字来接收数据包。对于所有数据包,我们在 ICMP header 中都有一个标识值。

我在多个终端运行ping

例如,我在三个终端中运行三个 ping google.com

第一次ping的识别值为23456,第二次ping的识别值为34564,第三次ping的识别值为98763。

我的问题是第二个 ping 必须接收到 34564 数据包的标识,但它接收到的标识值为 23456。

对于每个 ping,新的原始套接字正在创建。但它收到另一个 ping 数据包。

谁能解释一下,为什么它会收到另一个 ping 数据包?

更新:-

我还有一个疑问。疑问在于,

raw sockets 从哪里读取数据包,以及如何识别数据包是针对这个 raw socket 的?

更新 1:-

这是代码的链接。

ping_common.c

ping.c

ping.h

最佳答案

您看到的是原始套接字的设计,因为原始套接字旨在接收所有原始数据包。因此,要只接收对某些 ICMP 数据包的回复,您需要在套接字上应用过滤器。首先,您可以使用 ICMP_FILTER 套接字选项来限制某些 ICMP 类型的接收:

struct icmp_filter filter;
filter.data = <bit mask of ICMP types, like ICMP_REPLY>;
setsockopt(sock, SOL_RAW, ICMP_FILTER, &filter, sizeof filter)

其次,您可以附加套接字过滤器以强制只接收具有给定 ICMP ID 的包:

struct sock_fprog filter;
// set filter to check ID with your own ID
setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof filter);

关于c - 为什么 ping 会收到另一个 ping 命令包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com