12.1 libpcap文件存储格式

WinPcap采用了libpcap文件存储格式,该文件格式包含了被捕获数据包的二进制数据,并且是许多网络工具(如Wireshark、WinDump、Etheral等)所使用的一种标准格式。

12.1.1 转储文件的头信息

WinPcap在存储数据包时会给该文件设置头信息,用来描述文件的版本、数据链路层类型等。该文件头信息采用pcap_file_header结构体表示,该结构体的具体定义如下:


struct pcap_fle_header{

bpf_u_int32 magic;/libpcap的文件格式标识/

u_short version_major;/存储文件格式的版本号,与WinPcap的版本无关/

u_short version_minor;

bpf_int32 thiszone;/时区修正/

bpf_u_int32 sigfgs;/时间戳的精度/

bpf_u_int32 snaplen;/每个数据包的最大捕获长度/

bpf_u_int32 linktype;/数据链路层类型/

};


WinPcap以标准libpcap格式存储文件的头信息如图12-1所示,各字段的具体含义如表12-1所示。

12.1 libpcap文件存储格式 - 图1

图 12-1 转储文件头信息(选中部分)

12.1 libpcap文件存储格式 - 图2

存储文件头信息的具体实现代码如下:


struct pcap_fle_header hdr;

hdr.magic=TCPDUMP_MAGIC;

hdr.version_major=PCAP_VERSION_MAJOR;

hdr.version_minor=PCAP_VERSION_MINOR;

hdr.thiszone=thiszone;

hdr.snaplen=snaplen;

hdr.sigfgs=0;

hdr.linktype=linktype;

fwrite((char*)&hdr,sizeof(hdr),1,fp);


上述代码中,各相关宏的定义如下:


defne TCPDUMP_MAGIC 0xa1b2c3d4//标准libpcap的文件格式

defne PCAP_VERSION_MAJOR 2

defne PCAP_VERSION_MINOR 4

defne DLT_EN10MB 1//以太网(10Mbps)


存储数据的系统调用fwrite函数的原型如下:


size_t fwrite(

const void*buffer,

size_t size,

size_t count,

FILE*stream

);


上述函数中,参数buffer指向待写的数据缓冲区;参数size为每个待写项的字节数;参数count为待写项的最大个数;参数stream为所操作的文件流。

函数返回实际写入的待写项个数,它可能会比参数count小。

[1]官方文档说明的原因是因为内核缓冲的问题。