0

实际上,如果我创建多个具有相同 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。偷看这三个协议的标题图,它应该变得很明显:我在较低级别工作,其中端口的概念是未知的。这就是我对端口号的理解。

4

1 回答 1

0

不,它的 RAW 仅意味着除了 RAW Internet 协议之外没有其他协议。如果没有 TCP 或 UDP,将没有任何端口来区分该数据包被发送到哪个应用程序,因此,所有内容都必须通过 IP 数据包的有效负载进行过滤。您必须手动执行此操作。最好的方法是编写一个程序,在检查后将这些数据包转发到您希望它去的任何地方。

于 2013-08-08T14:09:35.353 回答