Я работаю с libpcap на C в Linux (centos) и следую этому руководство Я хочу просто распечатать весь пакет в ASCII, и мне удалось заставить его работать, приведя его к u_char* в функции "my_callback". Но я не могу понять, как получить длину данных. strstr не работает. в заголовке есть элемент len, к которому вы можете получить доступ, чтобы получить размер, но я не могу найти ничего похожего для передаваемого пакета *. Любая помощь приветствуется.
размер пакета libpcap
Ответы (2)
В обратном вызове элемент caplen переменной pkthdr (см. структуру pcap_pkthdr) содержит размер захваченного пакета.
Например, предположим, что пакет захвачен. Общая длина кадра составляет 1024 байта. Однако драйвер захвата захватил только первые 128 байт кадра и сделал их доступными для обратного вызова.
В этом случае вы должны ожидать, что pkthdr->caplen будет 128, а header->len — 1024.
person
Einstein
schedule
07.04.2010
Общий размер пакета указан в поле «общая длина» в заголовке ip (http://en.wikipedia.org/wiki/IPv4_header#Total_Length).
Как получить это значение с помощью libpcap, можно найти в этом примере: http://www.tcpdump.org/sniffex.c
Вам просто нужно получить значение поля, которое ссылается на «общую длину» (с именем ip_len), из этой переменной:
const struct sniff_ip *ip; /* The IP header */
person
tremendows
schedule
15.07.2013
Нет, это общая длина пакета IPv4; не все пакеты являются пакетами IPv4 (это могут быть пакеты IPv6, пакеты ARP или различные другие типы пакетов), а длина пакета IPv4 в большинстве случаев не равна длине всего пакета в сети — например, для Ethernet также имеется 14-байтовый заголовок Ethernet, и, если длина пакета IPv4 + 14 меньше 60, также имеется трейлер Ethernet, чтобы дополнить пакет до 60 байт (64 байта, если вы включаете CRC) на Сегмент Ethernet.
- person ; 15.07.2013
Есть ли способ получить длину пакета с помощью libpcap, независимо от типа пакета (ip, arp, icmp...)?
- person tremendows; 16.07.2013
Да — поле
len
поля struct pcap_pkthdr
представляет собой фактическую длину пакета в сети/в эфире (хотя для эфира обратите внимание, что на большинстве платформ, если вы не выполняете захват в режиме монитора, пакеты 802.11 преобразуются в поддельные пакеты Ethernet, а в поле len указана поддельная длина поддельного пакета Ethernet, а не реальная длина пакета 802.11 в эфире). Однако это НЕ обязательно соответствует объему фактических пакетных данных, которые у вас есть в перехваченном файле — это caplen
.
- person ; 16.07.2013
Не знаю, что делать, я хотел бы удалить свой ответ, потому что он неправильный, но может быть полезен для других людей.
- person tremendows; 17.07.2013
Кроме того, пакеты могут иметь псевдозаголовок, содержащий метаданные о пакете, перед фактическим заголовком уровня канала передачи/эфира. Например, пакет, захваченный в режиме монитора на интерфейсе 802.11, может иметь заголовок Radiotap с такой информацией, как мощность сигнала . Если такой заголовок присутствует, значение в
caplen
и len
включает длину заголовка метаданных, а также длину пакета в сети/в эфире.
- person ; 30.05.2014
strstr()
на нем - плохая идея. Прочитайте код в этом руководстве, который обрабатывает пакетные данные как бинарные данные. Ответ Эйнштейна правильный; используйте полеcaplen
поляstruct pcap_pkthdr
в качестве количества байтов пакетных данных. - person   schedule 15.07.2013