背景
当前的项目需求是通过raw socket来获取当前物理机上指定条件(ip和端口)的包。
方法1:抓取所有的包,在用户态的recvfrom(or recv)后,再通过代码逻辑来进行过滤;
方法2:通过设置,在底层实现过滤;
从效率上来说,毫无疑问是方法2更好;
方法2的实现,依赖libpcap和BPF;在此先简单介绍一下libpcap的安装和使用;
安装
参考链接:
linux下安装libpcap
需要先安装:
1、安装GCC:
yum -y install gcc-c++(由于我当前的环境docker下已安装了gcc,所以这一步跳过)
2、安装flex:
yum -y install flex
没有flex,直接安装libpcap会提示"Your operating system’s lex is insufficient to compile libpcap"错误;
3、安装bison
yum -y install bison
前面安装的是flex,就需要搭配bison,如不会提示"don’t have both flex and bison;reverting to lex/yacc"错误;
4、安装libpcap
我是从官网下载的 libpcap-1.10.0.tar.gz 来安装的:
libpcap官方链接
下载了压缩包后解压,然后安装命令如下:
./configure
make
make install
使用
来一个简单的测试程序:
//device.c
#include <stdio.h>
#include <pcap.h>