libpcap 之前由于lex yacc 看不下去, 不好的借口(因为我也没有好好看看libpcap的接口设计及使用)
之后由于很多原因有接触了一下lex yacc (主要是我想写一个解析各种报文的程序,看了一段之后,似乎不适合,可能是理解不深吧)
回头再看scanner.l 似乎不是那么困难, grammer.y 也不是那么难, libpcap是一个很好的库, 其中内部的虚拟机的设计很是经典,
值得我们好好看看,学习接口设计, 学习代码...
理解一个库,看一下简介,即可入手了, 下载,编译,小实例接口一步一步开始了,
1 使用那个接口
在linux中用ifconfig即可查看机器上的网口
传递给程序
1) 输入
#include <stdio.h>
#include <pcap.h> int main(int argc, char *argv[]) {
char *dev = argv[1];
printf("Device: %s ", dev);
return(0);
}
2) pcap自己使用第一个
#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[])
{
char *dev, errbuf[PCAP_ERRBUF_SIZE];
dev = pcap_lookupdev(errbuf);
if (dev == NULL) {
fprintf(stderr, "Couldn't find default device: %s
", errbuf);
return(2);
}
printf("Device: %s
", dev);
return(0);
}
2 Opening the device for sniffing 打开设备准备sniffing
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf);
第一个参数 设备名(如 eth0, wlan0 etc )
第二个参数 capture 最大的报文字节数
第三个参数 是否处理 promisc 模式
第四个参数 指定超时时间(豪秒)
第五个参数 错误信息的指针 (就是有什么错误就写到这里, 你爱看不看, 也可以传null值)
3 编译表达式
int pcap_compile(pcap_t *p, /*handle 上一步的结果 */
struct bpf_program *fp/*编译之后的结果 */,
char *str/*输入过滤字符串 ip .. */,
int optimize,/*是否优化*/
bpf_u_int32 netmask/*网络的netmask */)
4 设置过滤器
int pcap_setfilter(pcap_t *p/*如上*/,
struct bpf_program *fp/*上一步的结果 */ );
5 获取一个报文
u_char *pcap_next(pcap_t *p,/*如上*/
struct pcap_pkthdr *h/*结果*/ );
6 关闭
pcap_close(handle);
现在去深入
pcap_compile
其乐无穷...
==>这里有更多
http://www.tcpdump.org/pcap.html