libpcap使用

libpcap支持从网卡进行live捕获, 也支持报文文件的读写.

创建句柄

pcap_open_offline

#include <pcap/pcap.h>

char errbuf[PCAP_ERRBUF_SIZE];

pcap_t *pcap_open_offline(const char *fname, char *errbuf);

通过打开pcap文件来创建一个pcap_t读取句柄.

pcap_dump_open

#include <pcap/pcap.h>

pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname);
pcap_dumper_t *pcap_dump_open_append(pcap_t *p, const char *fname);
pcap_dumper_t *pcap_dump_fopen(pcap_t *p, FILE *fp);

创建pcap文件写入(dump)句柄.

关闭句柄

pcap_close

#include <pcap/pcap.h>

void pcap_close(pcap_t *p);

关闭读取句柄, 不论是从网卡接口还是从pcap文件创建的.

pcap_dump_close

#include <pcap/pcap.h>

void pcap_dump_close(pcap_dumper_t *p);

关闭pcap文件写入(dump)句柄.

读取packet

pcap_open/pcap_dispatch

#include <pcap/pcap.h>

typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);
int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

设置选项

pcap_set_promisc

#include <pcap/pcap.h>

int pcap_set_promisc(pcap_t *p, int promisc);

设置混杂模式, 此时句柄必须是没有被激活的.

其他

pcap_breakloop

#include <pcap/pcap.h>

void pcap_breakloop(pcap_t *);

令pcap_loop()或pcap_dispatch()调用立即返回.

pcap_file

#include <pcap/pcap.h>

FILE *pcap_file(pcap_t *p);

从pcap文件读取句柄得到标准文件指针.

pcap_dump_file

#include <pcap/pcap.h>

FILE *pcap_dump_file(pcap_dumper_t *p);

从pcap文件写入(dump)句柄得到标准文件指针.