2011-03-08 387 views
6

不使用libpcap我想写一个遵循pcap文件格式(format)的日志文件。这个文件需要被WireShark读取。到目前为止,我已经用C++写的是:如何编写PCAP捕获文件头?

struct pcapFileHeader { 
    uint32_t magic_number; /* magic number */ 
    uint16_t version_major; /* major version number */ 
    uint16_t version_minor; /* minor version number */ 
    int16_t thiszone;  /* GMT to local correction */ 
    uint32_t sigfigs;  /* accuracy of timestamps */ 
    uint32_t snaplen;  /* max length of captured packets, in octets */ 
    uint32_t network;  /* data link type */ 
}; 

ofstream fileout; 
fileout.open("file.pcap", ios::trunc); 

pcapFileHeader fileHeader; 
fileHeader.magic_number = 0xa1b2c3d4; 
fileHeader.version_major = 2; 
fileHeader.version_minor = 4; 
fileHeader.thiszone = 0; 
fileHeader.sigfigs = 0; 
fileHeader.snaplen = 65535; //(2^16) 
fileHeader.network = 1;  //Ethernet 

fileout << fileHeader.magic_number << 
      fileHeader.version_major << 
      fileHeader.version_minor << 
      fileHeader.thiszone << 
      fileHeader.sigfigs << 
      fileHeader.snaplen << 
      fileHeader.network; 

fileout.close(); 

所以这应该做一个空白捕获文件,但是当我在Wireshark中打开它,我与打招呼:

文件“你好.pcap“似乎在数据包或其他数据的中间被缩短了。

我试着在二进制模式下打开输出文件,但没有帮助。我会在WireShark论坛发布这个,但我认为这是用户错误,WireShark没有问题。

帮助将不胜感激。

回答

3

<<写入格式为文本的数字(例如,五个字符的字符串“65535”而不是表示该数字的四个字节)。

要输出二进制数据打开文件与ios::binary和使用write。该声明将写入整个头:

fileout.write(reinterpret_cast<const char*>(&fileHeader), 
       sizeof fileHeader); 

字节顺序被读取器检测到,所以这是便携式只要还有的结构成员之间没有填充。

请注意,thiszone应该是int32_t

+0

而且,如果操作系统在一个重要的系统上,使用'ios :: binary'打开文件。 – nos 2011-03-08 21:37:12

+0

@nos - 好点,谢谢。 – aaz 2011-03-08 22:26:38