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

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 个数据包?是否有某种标头表示数据包长度,或者在最坏的情况下我将不得不解析数据包并自己计算长度?

dos*_*der 0

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