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 转储文件头信息(选中部分)
存储文件头信息的具体实现代码如下:
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]官方文档说明的原因是因为内核缓冲的问题。