Но когда я нюхал пакеты в функции обратного вызова, я обнаружил, что формат IP-пакета неверен, размер заголовка не равен 20 байт.
Ваша функция обратного вызова используетрезультаты вызова pcap_datalink()
на pcap_t
, чтобы определить, как анализировать пакеты, или вы указали различные функции обратного вызова в зависимости от результатов pcap_datalink()
, верно?
Если нет, вывероятно, предполагают, что пакеты будут иметь определенный тип заголовка канального уровня, что всегда неправильно.
Пакеты PPP не обязательно будут иметь тот же тип заголовка канального уровня, что и пакеты Ethernet (хотяв Windows с WinPcap они могут иметь одинаковый тип заголовка канального уровня!).Они также могут не иметь заголовка PPP;в частности, в Linux у них будет подготовленный Linux заголовок захвата , потому что, по крайней мере, в один момент ядро 1015 * будет отбрасывать заголовок PPP и поставлять no заголовок канального уровня, поэтому libpcap должен был сделать «готовый» перехват, чтобы получить тип протокола сетевого уровня.pcap_datalink()
вернет DLT_LINUX_SLL
, а не DLT_PPP
, для устройств PPP в Linux, чтобы указать это.