微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何刷新原始AF_PACKET套接字以获取正确的已过滤数据包

如何解决如何刷新原始AF_PACKET套接字以获取正确的已过滤数据包

sock = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
setsockopt(sock,SOL_SOCKET,SO_ATTACH_FILTER,&f,sizeof (f)) 

使用这个简单的BPF / LPF附加代码,当我尝试在套接字上接收数据包时,将得到一些与过滤器不匹配的错误数据包。似乎这些数据包在我调用setsockopt()之前就已经进入套接字了。

似乎应该先创建AF_PACKET SOCK_RAW套接字,然后附加过滤器,然后刷新套接字以清除那些错误的数据包。

所以问题是,如何清除那些数据包?

解决方法

您所描述的“错误”是真实的,我已经在职业生涯中的多家公司看到过。这个错误有一种类似于“口头传统”的东西,它是从一位网络工程师传给另一位工程师的。以下是常见的修补程序:

  1. 只需在套接字上调用facet_grid直到其为空
  2. 通过在用户模式下以及使用bpf过滤数据包进行双重过滤
  3. 像libpcap一样使用零bpf技术,在这种情况下,您首先应用空的bpf,然后清空套接字,然后应用真实的bpf。

I've written about this problem extensively on my blog尝试将围绕此bug的口头传统整理成具体的建议和最佳实践。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。