不使用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中打开它时,我受到了欢迎:
文件“hello.pcap”似乎在数据包或其他数据中间缩短了。
我尝试在二进制模式下打开输出文件,但这没有帮助。我会在WireShark论坛上发布这个,但我认为这是用户错误,而不是WireShark的错误。
非常感谢帮助。
答案 0 :(得分:3)
<<
将格式化为文本的数字写入(例如,五个字符的字符串“65535”而不是代表该数字的四个字节)。
要输出二进制数据,请使用ios::binary
打开文件并使用write
。该语句将写出整个标题:
fileout.write(reinterpret_cast<const char*>(&fileHeader),
sizeof fileHeader);
读者会检测到字节序,因此只要结构成员之间没有填充,这就是可移植的。
请注意,thiszone
应为int32_t
。