前面24个字节是.cap文件的文件头。
     头信息对应的结构体为:
    
    struct pcap_file_header {
    
      bpf_u_int32 magic;
    
      u_short version_major;
    
      u_short version_minor;
    
      bpf_int32 thiszone; /* gmt to local correction */
    
      bpf_u_int32 sigfigs; /* accuracy of timestamps */
    
      bpf_u_int32 snaplen; /* max length saved portion of each pkt */
    
      bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
    
    };
  
     cap文件中的linktype很重要,不同的网络环境下抓包,数据帧的帧头是不一样的。
    
    在局域网内抓包,linktype为1 ( DLT_EN10MB, Ethernet (10Mb) ),以太网的帧头就是两个网卡物理地址;
    
    如果直接用ADSL拨号上线,则linktype为9 ( DLT_PPP, Point-to-point Protocol),数据帧头为PPP协议。
    
     关于linktype支持的类型,可以参考pcap-bpf.h中定义的以DLT_开头的宏。
  
    
    ========================================================================
  
    头信息后是顺序的每个数据段的信息,每个数据段中包含抓包时间、包类型等信息,然后是包的内容。
    
    struct pcap_pkthdr {
    
     struct timeval ts; /* time stamp */
    
     bpf_u_int32 caplen; /* length of portion present */
    
     bpf_u_int32 len; /* length this packet (off wire) */
    
    };
    
     ts为抓包的时间;
    
     caplen和len我发现一般都是一样的。(什么情况下会不一样还没搞懂)
  
     16字节的数据段头之后就是包的信息了。例子中的包信息是局域网中抓的,所以是以太网帧头,结构体如下:
    
    struct EthernetPacket
    
    {
    
     char MacDst[6]; ///< 目的网卡物理地址
    
     char MacSrc[6]; ///< 源网卡物理地址
    
     unsigned short PacketType; ///< 包类型, ip或ARP等
    
    };
    
     PacketType=0x0008是IP包,PacketType=0x0608是ARP包。
  
    
  
红色框内为 pcap_file_header
绿色框内为 pcap_pkthdr
后面为包内数据
注意两个长度,一个是高位在后,一个是高位在前,后边长度不包含IP头长度

