在 Linux 中使用 C 中的多个 Ethtypes 接收以太网数据包

Receive Ethernet packets in Linux with several Ethtypes in C

我想从 Linux 中的套接字接收以太网数据包,但仅限那些具有两个自定义 Ethtype 值之一的数据包。 据我所知,如果只应接收 1 个 ethtype,则可以在创建套接字时指定此值,如下所示

int socket = socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_CUSTOM_1);

但是如果我有 2 种不同的 ethtypes 怎么办?我应该使用 2 个套接字还是编写一些自定义过滤器?或者有什么简单的方法吗?

我认为你应该使用 libpcap 库。您需要访问 bpf 打包过滤器。 这很容易。 或者您可以使用 iptables 规则 netfilter 库。您需要设置预路由 iptables 规则以将所有数据包转发到特定端口,并且您的应用程序将此端口绑定为侦听模式,您可以接收完整的数据包。

创建两个套接字,每个套接字对应一种以太网类型。然后你可以使用 select()epoll() 同时等待任一套接字上的数据包。