如何从linux tun / tap读取数据包

我已经使用连接到现有的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