Я использую fp = pcap_open_dead(DLT_EN10MB,65535);
для захвата кадров в формате pcap.
Предположительно вы имеете в виду «для записи кадров в файл в формате pcap»; «мертвый» в «pcap_open_dead» означает «не жить», как в «вы не можете захватить пакеты из этого».
(Это необходимо потому, что pcap_dump_open()
вызов не принимает значение DLT_ и длину снимки в качестве типа, он принимает pcap_t *
и получает значение DLT_ и длину снимки оттуда. Это удобно, если вы сохраняете пакеты из живой захват вы открыли с pcap_open_live()
или pcap_create()
/pcap_activate()
или другого захвата файла, который вы открыли с pcap_open_offline()
, но это не очень удобно, если пакеты не приходят из Libpcap/WinPcap.)
но что Fp = pcap_open_dead (DLT_XXX) следует использовать, если я хочу пропустить заголовок ethernet. Мой модуль работает на уровне 3, поэтому я хочу, чтобы захватить пакеты, начиная от слоя 3.
Если слой «3» означает «IP», так что все ваши пакеты IPv4 или IPv6-пакеты, вы хотите DLT_RAW
.
Пропуск заголовка Ethernet, однако, составляет . Если какой-либо механизм подает захваченные кадры, то снабжает фреймы заголовками Ethernet, то вы должны пропустить заголовок Ethernet - и отбрасывать кадры, где поле типа/длины в заголовке Ethernet имеет значение, отличное от 0x0800 для IPv4 или 0x86dd для IPv6 - и вычислить соответствующую длину захваченной длины и длины проводов (на 14 байтов меньше, чем захваченные и по-проводные длины кадров с Ethernet-заголовками; если любой из них меньше или равен 14, отбросьте кадр), и передайте их вместе с указателем на данные после заголовка Ethernet до pcap_dump()
.
Ethernet-заголовок всегда длиной 14 байт, поэтому вы можете выдвинуть указатель на 14 позиций, чтобы его пропустить :) –