yon*_*igo 5 c linux network-programming
我已使用以下方法连接到现有的 Tap 设备
fd = open(...)
Run Code Online (Sandbox Code Playgroud)
现在我想逐包读取它。如果我使用
read(fd,buffer,sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
我不会准确读取 1 个数据包。
我怎样才能准确读取 1 个数据包?是否有某种标头表示数据包长度,或者在最坏的情况下我将不得不解析数据包并自己计算长度?
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;
}
Run Code Online (Sandbox Code Playgroud)
其中pcap_loopprocess_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