如何编写PCAP捕获文件头?

Sco*_*ott 6 c++ logging pcap wireshark libpcap

不使用libpcap我试图写一个符合pcap文件格式(格式)的日志文件.WireShark需要读取此文件.到目前为止,我用C++编写了这个:

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();
Run Code Online (Sandbox Code Playgroud)

所以这应该是一个空白的捕获文件,但是当我在Wireshark中打开它时,我受到了欢迎:

文件"hello.pcap"似乎在数据包或其他数据中间被缩短.

我试过以二进制模式打开输出文件,但这没有帮助.我会在WireShark论坛上发布这个,但我认为这是用户错误,而不是WireShark的错误.

非常感谢帮助.

aaz*_*aaz 3

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

要输出二进制数据,请使用打开文件并ios::binary使用write. 该语句将写入整个标头:

fileout.write(reinterpret_cast<const char*>(&fileHeader),
              sizeof fileHeader);
Run Code Online (Sandbox Code Playgroud)

字节顺序由读取器检测,因此只要结构成员之间没有填充,它就是可移植的。

注意thiszone应该是int32_t.