为什么 recvfrom() 函数可以接收所有流量

why recvfrom() function can receive all of traffic

我用 C 编写了一个 ICMP ping 代码,我通过 socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) 创建了一个套接字 我将其绑定为:bind(sendSock, (struct sockaddr *)&addr, sizeof(addr)),在调用 sendto() 函数后,我调用了 recvfrom() 函数来接收 ICMP 回复,但我发现我可以接收所有的包,而不仅仅是我发送的 destIP之前。

为什么 recvfrom() 行为是这样的?我是一个 Java 程序员,我知道 Java socket 只接收它用特定 IP 发送的包。

是不是任何套接字都可以接收所有C语言的包?

这与 recvfrom 系统调用无关,与您创建的套接字类型有关。

来自raw(7) man page

A raw socket can be bound to a specific local address using the bind(2) call. If it isn't bound, all packets with the specified IP protocol are received