我已经使用连接到现有的Tap设备
fd = open(...)
现在我想从数据包中读取数据包。 如果我使用
read(fd,buffer,sizeof(buffer));
我不会读完整的1包。
我怎样才能读完整的1包? 是否有某种表示数据包长度的标题,或者在最糟糕的情况下,我将不得不parsing数据包并自己计算长度?
read()
从tap设备读取字节的方式我错了。 事实证明,当我使用read()
它读取正好1帧,(或n个字节,如果n小于帧大小)
Libpcap: http ://www.tcpdump.org/pcap3_man.html
你可以通过你指定的接口读取数据包,在这个例子中是wlan1。
int main(){ char *device = NULL; pcap_t* descr; if(argc > 0) device = "wlan1"; if(device == NULL) { printf("%s\n",errbuf); exit(1); } descr = pcap_open_live(device,BUFSIZ,0,-1,errbuf); if(descr == NULL){ printf("pcap_open_live(): %s\n",errbuf); exit(1); } errbuf[0] = 0; handle = pcap_open_live(device, BUFSIZ,1,0,errbuf); pcap_loop(handle,-1, process_packet, NULL); pcap_close(handle); return 0; }
在pcap_loop
,process_packet是进入的数据包的回调。
让我知道,如果有什么你不确定的。
PS这里是一些链接,应该可以帮助你解析802.11 /以太网头。
http://madwifi-project.org/wiki/DevDocs/RadiotapHeader http://yuba.stanford.edu/~casado/pcap/section2.html http://www.cacetech.com/documents/PPI%20Header%20format %201.0.7.pdf