【发布时间】:2017-02-02 00:46:46
【问题描述】:
我想从 Linux 中的套接字接收以太网数据包,但只接收那些具有两个自定义 Ethtype 值之一的数据包。 据我所知,如果只接收 1 个 ethtype,则可以在创建这样的套接字时指定此值
int socket = socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_CUSTOM_1);
但是如果我有 2 种不同的 ethtype 怎么办?我应该使用 2 个套接字还是编写一些自定义过滤器?或者有什么简单的方法吗?
【问题讨论】:
-
我会使用 2 个套接字,这样您的代码就不会为系统收到的每个数据包运行,只是为了过滤掉大部分。
-
您也可以考虑使用一个套接字设置来捕获所有内容,然后安装 BPF 程序。事实上,我会使用 libpcap 并利用
pcap_setfilter函数,在 linux 上,它知道如何将 BPF 安装到内核中。link指令应该允许您在链接头中指定适当的字段来进行比较。 -
@Barmar 请将您的评论添加为答案