Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何刷新原始AF_数据包套接字以获得正确的过滤数据包_Linux_Sockets_Ethernet_Raw Sockets_Bpf - Fatal编程技术网

Linux 如何刷新原始AF_数据包套接字以获得正确的过滤数据包

Linux 如何刷新原始AF_数据包套接字以获得正确的过滤数据包,linux,sockets,ethernet,raw-sockets,bpf,Linux,Sockets,Ethernet,Raw Sockets,Bpf,使用这个简单的BPF/LPF attach代码,当我尝试在套接字上接收数据包时,将得到一些与筛选器不匹配的错误数据包。似乎这些数据包在我调用setsockopt()之前就进入了套接字 似乎应该首先创建AF_PACKET SOCK_RAW套接字,然后连接过滤器,然后刷新套接字以除去那些错误的包 所以问题是,如何清除这些数据包?你所描述的“错误”是真实的,我在我的职业生涯中在多家公司都看到过。围绕这个bug,有一种类似于“口头传统”的东西从一个网络工程师传给另一个网络工程师。以下是常见的修复方法:

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

似乎应该首先创建AF_PACKET SOCK_RAW套接字,然后连接过滤器,然后刷新套接字以除去那些错误的包

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

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

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

  • 尝试将围绕此缺陷的口头传统编纂成具体的建议和最佳实践。

    如果我的答案解决了此问题,您介意将其标记为正确吗?
    sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &f, sizeof (f))