2017-01-16 28 views
0

我想在Linux中接收来自套接字的以太网数据包,但只有那些具有两个自定义Ethtype值之一的套接字。 据我所知,如果只有1 ethtype应该被接收,这是可能的,而这样的接收Linux中的以太网数据包,并在C中有多个EthTypes

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

但是创造插座如果我有2个不同的ethtypes可以指定这个值?我应该使用2个套接字还是写一些自定义过滤器?或者有什么简单的方法?

+1

我会使用2个套接字,这样你的代码就不会为系统收到的每个数据包运行,只是为了过滤掉大部分数据包。 – Barmar

+0

您也可以考虑使用一个套接字来设置捕获所有内容,然后安装BPF程序。事实上,我只是使用libpcap并利用'pcap_setfilter'函数,它在linux上知道如何将BPF安装到内核中。 'link'指令应该允许你在链接头中指定相应的字段来进行比较。 –

+0

@Barmar请将您的评论添加为答案 – user3237732

回答

1

创建两个套接字,每个ethertype一个套接字。然后,您可以使用select()epoll()同时等待任一套接字上的数据包。

0

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

相关问题