struct pcap_pkthdr
- это НЕ структура, которая определяет формат заголовков пакетов в файле pcap; это структура, которая определяет формат заголовков пакетов, предоставляемый программам, использующим libpcap или WinPcap.
Структура, которая определяет формат заголовков пакетов в файле pcap, NOT в любом из включаемых файлов pcap, поскольку libpcap / WinPcap предоставляет подпрограммы, которые читают эти заголовки и преобразуют их при необходимости в * 1008. * заголовки. В отличие от struct pcap_pkthdr
отметка времени в заголовках пакетов в файле pcap всегда имеет 32-битное поле «секунд» и 32-битное поле «микросекунд», даже в системах, где time_t
и значение tv_sec
в struct timeval
- это 64 бита.
Т.е. структура определяется
struct pcap_timeval {
bpf_int32 tv_sec; /* seconds */
bpf_int32 tv_usec; /* microseconds */
};
struct pcap_sf_pkthdr {
struct pcap_timeval ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
где struct pcap_sf_pkthdr
- структура в файле.
Обратите внимание, что если вы читаете struct pcap_sf_pkthdr
из файла, вам придется поменять местами ts.tv_sec
, ts.tv_usec
, caplen
и len
IF файл был написан на машине, чей порядок байтов отличается от машины, на которой вы читаете файл. Что-то столь же простое, как ntohl()
, будет НЕ работать - если, например, ваш файл был записан на той же машине, что и тот, на котором вы его читаете, обмен байтами не требуется.
ONLY способ заставить эту работу заключаться в READ заголовке файла, а не просто пропускать его с помощью fseek()
. Если «магическое число» в заголовке файла имеет значение 0xa1b2c3d4
, то вам не нужно делать никакой замены байтов; если оно имеет значение 0xd4c3b2a1
, вам нужно будет поменять местами значения в заголовке файла и struct pcap_sf_pkthdr
. Обратите внимание, что ntohl()
и htonl()
будут НЕ байт-своп, если вы работаете на машине с прямым порядком байтов, такой как машина PowerPC / Power Architecture или машина MIPS, мэйнфрейм IBM или ... ..
Обратите внимание, что не все файлы захвата будут файлами pcap; если это файлы pcap-NG, их нужно читать совершенно по-другому. Libpcap 1.1 и более поздние версии знают, как читать файлы pcap-NG (API libpcap / WinPcap недостаточно мощен для обработки всех файлов pcap-NG, но он может, например, обрабатывать файлы pcap-NG, которые иметь только один раздел и иметь пакеты только от одного сетевого адаптера, и libpcap 1.1 и более поздние могут их читать). Я бы посоветовал, как и предполагали, использовать libpcap / WinPcap для чтения файлов захвата, а не писать собственный код для этого.