Как да напиша заглавка на файла за заснемане на PCAP?

Без да използвам 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();

Така че това трябва да направи празен файл за заснемане, но когато го отворя в Wireshark, ме посрещат с:

Файлът "hello.pcap" изглежда е бил съкратен по средата на пакет или други данни.

Опитах се да отворя изходния файл в двоичен режим, но това не помогна. Бих публикувал това във форума на WireShark, но мисля, че това е потребителска грешка, а не нещо нередно с WireShark.

Помощта ще бъде много ценена.


person Scott    schedule 08.03.2011    source източник


Отговори (1)


<< записва числата, форматирани като текст (напр. низ от пет знака "65535" вместо четири байта, представляващи това число).

За да изведете двоични данни, отворете файла с ios::binary и използвайте write. Това изявление ще напише цялата заглавка:

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

Endianness се открива от четеца, така че това е преносимо, стига да няма подложка между членовете на структурата.

Имайте предвид, че thiszone трябва да бъде int32_t.

person aaz    schedule 08.03.2011
comment
И само в случай, че операцията е на система, където има значение, отворете файла и с ios::binary - person nos; 09.03.2011