libpcap 库使用

Libpcap:

linux 数据流:网络数据包--》网卡--》网卡驱动--》数据链路层--》IP层--》传输层--》应用层

libpcap流:网络数据包--》网卡--》网卡驱动--》网络分接头--》数据包过滤--》用户API



libpcap抓包流程:
1,查找网络设备
char *pcap_lookupdev(char *errbuf);返回可用的网络设备名指针列表

2,打开网络设备
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) ;
返回用于捕获网络数据包的数据包捕获描述符,以后对于此网络设备的操作基于这个描述符

3,获取网络参数
int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf) ;
获得指定网络设备的IP地址和子网掩码,当然这个步骤并不是必须,但是为了显示的完整性

4,编译过滤策略
int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask) ;
函数的作用即使将用户指定的过滤策略str编译到过滤程序fp中。
5,设置过滤器
int pcap_setfilter(pcap_t *p, struct bpf_program *fp);
函数用于设置上一步骤配置好的过滤器,当然要注明一点,步骤4和步骤5也不是必须的,
如果不采用过滤,意味着程序会抓到所有的网络数据包

6,利用回调函数捕获数据包  
Libpcap提供的是一种回调的机制来获取数据包:
int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user); 
功能基本与pcap_dispatch()函数相同,只不过此函数在cnt个数据包被处理或出现错误时才返回,但读取超时不会返回。
而如果为 pcap_open_live()函数指定了一个非零值的超时设置,然后调用pcap_dispatch()函数,
则当超时发生时 pcap_dispatch()函数会返回。cnt参数为负值时pcap_loop()函数将始终循环运行,除非出现错误。

int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user); 
捕获并处理数据包,cnt 参数指定函数返回前所处理数据包的最大值。
cnt=-1表示在一个缓冲区中处理所有的数据包。
cnt=0表示处理所有数据包,直到产生以下错误之一:读取 到EOF;超时读取。
callback参数指定一个带有三个参数的回调函数,这三个参数为:一个从pcap_dispatch()函数传递过来的 u_char指针, 一个pcap_pkthdr结构的指针,和一个数据包大小的u_char指针。
如果成功则返回读取到的字节数。读取到EOF时则返回零 值。
出错时则返回-1,此时可调用pcap_perror()或pcap_geterr()函数获取错误消息。

u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
返回指向下一个数据包的u_char指针

int pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data);
直接把数据包放在pkt_data中;
7,关闭网络设备 
pcap_close();关闭网络设备,释放资源

  更多函数参数:  http://blog.csdn.net/wangjiannuaa/article/details/7310716

你可能感兴趣的:(libpcap 库使用)