c++ - PCAP捕获文件头怎么写?

标签 c++ logging wireshark pcap libpcap

在不使用 libpcap 的情况下,我试图编写一个符合 pcap 文件格式 ( format ) 的日志文件。该文件需要 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();

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

The file "hello.pcap" appears to have been cut short in the middle of a packet or other data.

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

非常感谢您的帮助。

最佳答案

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

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

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

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

请注意 thiszone应该是 int32_t .

关于c++ - PCAP捕获文件头怎么写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5237486/

相关文章:

c++ - SHA1+RSA - 帮助在 C++ 中使用 Botan

logging - JBoss Portal Server 上托管的两个不同应用程序具有组合日志记录

java - 我在java应用程序中看不到udp多播流量,而我可以从wireshark中看到

java - 使用 Java 将 pcap-ng 转换为 pcap

c++ - 如何使用 fseek() 进入一行的开头

c++ - 在向 hash_map 添加一些项目时,我可以从 hash_map 中获取计数吗?

c++ - 在 C++ 中以编程方式查找浮点寄存器的数量

javascript - Log4j2 路由附加器 JavaScript 配置错误

sql - 无效查询的 MySQL 日志

linux - 如何捕获远程系统网络流量?