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

C 为什么ping会收到另一个ping命令包?,c,linux,ping,raw-sockets,C,Linux,Ping,Raw Sockets,我正在学习C中的ping实现。 问题是,我使用原始套接字来接收数据包。对于所有数据包,我们在ICMP头中都有一个标识值 我正在多终端中运行ping 例如,我在三个终端上运行了三个ping google.com 对于第一个ping,标识值为23456,第二个ping标识值为34564,第三个ping标识值为98763 我的问题是第二个ping必须接收34564数据包的标识,但它接收的标识值为23456 为每个ping创建新的原始套接字。但它收到另一个ping数据包 谁能解释一下,为什么它会收到另一

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

我正在多终端中运行
ping

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

对于第一个ping,标识值为23456,第二个ping标识值为34564,第三个ping标识值为98763

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

为每个ping创建新的原始套接字。但它收到另一个ping数据包

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

更新:-

我还有一个疑问。问题是

原始套接字从何处读取数据包,以及如何识别此原始套接字的数据包

更新1:-

这是代码的链接


您看到的是原始套接字的设计,因为原始套接字意味着接收所有原始数据包。因此,要仅接收对某些ICMP数据包的回复,您需要在套接字上应用筛选器。首先,您可以使用
ICMP\u过滤器
socket选项来限制某些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数据包的回复,您需要在套接字上应用筛选器。首先,您可以使用
ICMP\u过滤器
socket选项来限制某些ICMP类型的接收:

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

要回答您的其他疑问:

  • 原始套接字从何处读取数据包,以及如何识别此原始套接字的数据包
原始套接字位于IP层之后的其他协议处理程序旁边。摘自《理解Linux网络内部结构》第25.5章:

以下是协议之间交互的一些示例:

IP协议

第24章中描述的ip_本地_交付_完成例程 将ICMP消息输入到由注册的接收例程ICMP_rcv ICMP协议,但它也将它们传送到原始IP套接字 根据ICMP协议注册的(原始v4输入)


要回答您的其他疑问:

  • 原始套接字从何处读取数据包,以及如何识别此原始套接字的数据包
原始套接字位于IP层之后的其他协议处理程序旁边。摘自《理解Linux网络内部结构》第25.5章:

以下是协议之间交互的一些示例:

IP协议

第24章中描述的ip_本地_交付_完成例程 将ICMP消息输入到由注册的接收例程ICMP_rcv ICMP协议,但它也将它们传送到原始IP套接字 根据ICMP协议注册的(原始v4输入)


虽然我试过了,但在您运行的未列出的代码中找不到问题。它发生在应答包中。我使用recvmsg接收数据包。在recvmsg验证数据包之后,在验证中,标识值被更改。@suresh:谢谢提供信息。现在请给我们看一些代码。@suresh您链接的代码是linux
ping
命令的源代码,它们没有您描述的问题。你需要展示你自己的代码。我只学习这个代码。因为他们跳过了那个包。我怀疑这是原始插座。为什么它会收到另一个套接字数据包?虽然我试过了,但在您正在运行的未登录代码中找不到问题。它发生在应答数据包中。我使用recvmsg接收数据包。在recvmsg验证数据包之后,在验证中,标识值被更改。@suresh:谢谢提供信息。现在请给我们看一些代码。@suresh您链接的代码是linux
ping
命令的源代码,它们没有您描述的问题。你需要展示你自己的代码。我只学习这个代码。因为他们跳过了那个包。我怀疑这是原始插座。为什么它会收到另一个套接字数据包?@suresh为两次ping创建了两个原始套接字。原始套接字不会检查任何条件,比如只读取此套接字的数据包?@suresh我们说的是原始套接字,没有仅用于此套接字的数据包,原始套接字用于所有数据包,您可以自己进行筛选。@suresh为两次ping创建了两个原始套接字。原始套接字不会检查任何条件,例如仅读取此套接字的数据包?@suresh我们谈论的是原始套接字,没有仅用于此套接字的数据包,原始套接字用于所有数据包,你能做的就是自己过滤。