当前位置:Linux教程 - Linux - 和我一起学libpcap(3)

和我一起学libpcap(3)

2.3 出错处理

象其它库一样,libpcap 也有自己的错误处理机制
基本上每个函数都有返回值,出错时返回值<0,另外有如下函数
void pcap_perror(pcap_t *, char *);
char *pcap_strerror(int);
char *pcap_geterr(pcap_t *);
前两个和 perror() strerror() 用法相同,最后一个也很简单
在 pcap_t 中有一个成员存了错误字串
struct pcap {
...
char errbuf[PCAP_ERRBUF_SIZE];
};
所以......

于是我们在刚才的程序中加上错误处理
先加一个函数
#include
int err_quit(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(-1);
}

之后处理每个函数的异常,在成功建立捕捉句柄pcap_t *pd前,使用ebuf参数
char *device = pcap_lookupdev(ebuf);
if(device == NULL)
err_quit(""%s"", ebuf);
有了句柄pd后
if(pcap_compile(pd, &fcode, NULL, 1, 0) < 0)
err_quit(""%s"", pcap_geterr(pd));
注意不是每个函数都是出错返回<0
pcap_datalink(pd)和pcap_snapshot(pd)等可不要这么处理
2.4 参数初步研究

前面使用各函数时,并没有具体说明每个函数的意义,现在来探讨一下

pcap_t * pcap_open_live(char *device, int snaplen, int promisc,
int to_ms, char *ebuf)
device指定设备,snaplen指定最长抓多少字节,ebuf出错信息,前面都说过
promisc指出是否设置为混杂模式(不懂?我也不懂,整个网都听还有什么安全性可言)
to_ms设置超时时间,单位milliseconds

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
cnt为要抓的包数,pcap_loop在正常时抓cnt个包后返回,异常时返回值<0
user是要传入callback()的数据,例如我们把上面的程序修改几行
file://pcap_loop(pd, 10, printer, NULL);
pcap_loop(pd, 10, printer, (u_char*)pd);
再在printer()内加
pcap_stat stat;
pcap_stats((pcap_t*)user, &stat);
printf(""recv %d, drop %d. "", stat.ps_recv, stat.ps_drop);
再编译运行后输出为
166.111.168.0:255.255.252.0
10Mb以太网
recv 1, drop 0.
recv 2, drop 0.
recv 3, drop 0.
recv 4, drop 0.
recv 5, drop 0.
recv 6, drop 0.
recv 7, drop 0.
recv 8, drop 0.
recv 9, drop 0.
recv 10, drop 0.
recv 10, drop 0.

int pcap_compile(pcap_t *p, struct bpf_program *program,
char *buf, int optimize, bpf_u_int32 mask)
该函数用于解析过滤规则串buf,填写bpf_program结构.
optimize为1表示对过滤规则进行优化处理
netmask指定子网掩码
buf的格式比较复杂

int pcap_setfilter(pcap_t *handle, struct bpf_program *filter)
把pcap_compile()构造的filter设置到handle上

今天到这里吧,改天有时间再继续
大家早上好,我晚安 :,)