实际上,如果我创建多个具有相同 IP 地址的 RAW 套接字。我可以绑定所有这些,因此所有套接字都接收到数据包。
有什么可以避免的方法,使得试图绑定相同 IP 地址的其他进程收到错误?
我正在使用原始套接字
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocol);
在手册页中 (7)
可以使用 bind(2) 调用将原始套接字绑定到特定的本地地址。如果没有绑定指定IP协议的所有数据包都会被接收。此外,可以使用 SO_BINDTODEVICE 将 RAW 套接字绑定到特定的网络设备;见套接字(7)。
您不能将原始套接字绑定到特定端口,因为“端口”是 TCP 和 UDP 中的概念,而不是 IP。偷看这三个协议的标题图,它应该变得很明显:我在较低级别工作,其中端口的概念是未知的。这就是我对端口号的理解。