我们电脑上的网卡有一个重要功能就是判断每一个到自己这的数据帧是不是发给自己的,如果不是的话会主动丢弃,从而保证了因特网的一定的安全性。而利用win_pcap将网卡设置为混杂模式可以捕获网卡上的所有经过的数据包。
首先利用pcap_findalldevs()函数获取已连接的网络适配器列表。
int pcap_findalldevs(
pcap_if_t * * alldevsp,
char *errbuf
)
**alldevsp是一个指向网卡链表头一个节点的指针,errbuf返回的是错误信息。
pcap_if_t结构体的定义如下:
这样可以打印出网卡列表从而选择一个网卡进行数据捕获。
然后利用pcap_open_live()打开网络设备,这个函数定义入下:
pcap_t * pcap_open_live (
char * device, //网络设备
int snaplen, //捕获的数据包长度,最大65535
int promisc, //网络设备工作模式,1为混杂模式
int to_ms, //捕获的时间间隔
char *ebuf //错误缓冲区
)
返回值是winpcap句柄
再利用pcap_compile()和pcap_setfilter()设置过滤规则。
int pcap_compile(
pcap_t * p, //WinPcap句柄
struct bpf_program * fp, //BPF规则
char * str, //过滤规则字符串
int optimize, //优化
bpf_u_int32 netmask //掩码
)
如果我们只想捕获IP数据包的话,就把过滤规则字符串设置为“IP”,编译过后的过滤规则将被返回至struct bpf_program * fp,这是一个编译过的过滤规则结构体。
int pcap_setfilter(
pcap_t * p, //WinPcap句柄
struct bpf_program * fp //BPF规则
)
给winpcap句柄设置过滤