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

标签 linux sockets ethernet raw-sockets bpf

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 套接字,然后附加过滤器,然后刷新套接字以摆脱那些错误的数据包。
所以问题是,如何刷新这些数据包?

最佳答案

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

  • 只需调用recv直到它为空
  • 通过在用户模式下过滤数据包以及使用 bpf
  • 进行双重过滤
  • 像 libpcap 一样使用零 bpf 技术,首先应用一个空的 bpf,然后清空套接字,然后应用真正的 bpf。

  • I've written about this problem extensively on my blog尝试将围绕这个错误的口头传统编纂成具体的建议和最佳实践。

    关于linux - 如何刷新原始 AF_PACKET 套接字以获取正确的过滤数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64516987/

    相关文章:

    php - 构建 hiphop 时自定义 libevent 包出现问题

    c - 发往自身的 UDP RAW_SOCKET 数据包在环回接口(interface)而不是 eth0 上捕获

    Python IRC 机器人 : Set variables from channel reading

    .net - 如何使用以太网连接从秤上读取重量

    header - 以太网 header 是什么样的?

    c - 传递 GtkWidget 参数

    linux - 更改 gpio 值时通知

    linux - 在 Linux 平台上捕获文件系统调用

    perl socket编程连续写入socket后的问题

    arduino - 如何在不使用计算机的情况下使用Arduino发送电子邮件?