一、源码构建libpcap库
1. 下载源码
wget https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz
2. 解压
tar xf libpcap-1.10.4.tar.gz
3. 编译
cd libpcap-1.10.4
./configure --prefix=/opt/libpcap-1.10.4
make
sudo make install
二、编程
1. 打开抓包口
pcap_t *
pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf);
实际上pcap_open_live简化了调用,内部调用了其他函数,对于更加定制化的调用,可以手动调用这些函数
pcap_t *
pcap_create(const char *device, char *errbuf);
int
pcap_set_snaplen(pcap_t *p, int snaplen);
int
pcap_set_promisc(pcap_t *p, int promisc);
int
pcap_set_timeout(pcap_t *p, int timeout_ms);
int
pcap_activate(pcap_t *p);
2. 设置过滤条件
- 首先编译过滤条件
int
pcap_compile(pcap_t *, struct bpf_program *, const char *, int,bpf_u_int32);
int
pcap_compile_nopcap(int, int, struct bpf_program *,const char *, int, bpf_u_int32);
- 设置过滤条件
int
pcap_setfilter(pcap_t *, struct bpf_program *);
3. 获取数据包
int
pcap_loop(pcap_t *, int, pcap_handler, u_char *);
int
pcap_dispatch(pcap_t *, int, pcap_handler, u_char *);
const u_char *
pcap_next(pcap_t *, struct pcap_pkthdr *);
int
pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **);
以上函数都是获取数据,底层实现都是一样的,只是一些是在内部调用回调函数,一些直接将数据返回,外部进行处理,看具体需要进行选择。
4. 结束抓包
void
pcap_close(pcap_t *);