Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

和我一起学libpcap(3)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  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上

  今天到这里吧,改天有时间再继续

  大家早上好,我晚安 :,)




 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:和我一起学libpcap(2)   下一篇:socket 基础知识

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号