Как написать заголовок файла захвата 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);

Порядок байтов определяется читателем, поэтому он переносим, ​​если между элементами структуры нет заполнения.

Обратите внимание, что thiszone должно быть int32_t.

person aaz    schedule 08.03.2011
comment
И на всякий случай, если операция находится в системе, где это важно, откройте файл также с помощью ios::binary - person nos; 09.03.2011