【问题标题】:Receive Ethernet packets in Linux with several Ethtypes in C在 Linux 中接收以太网数据包,在 C 中具有多种 Ethtype
【发布时间】: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 请将您的评论添加为答案

标签: c linux sockets ethernet


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多