размер пакета libpcap

Я работаю с libpcap на C в Linux (centos) и следую этому руководство Я хочу просто распечатать весь пакет в ASCII, и мне удалось заставить его работать, приведя его к u_char* в функции "my_callback". Но я не могу понять, как получить длину данных. strstr не работает. в заголовке есть элемент len, к которому вы можете получить доступ, чтобы получить размер, но я не могу найти ничего похожего для передаваемого пакета *. Любая помощь приветствуется.


person Ilia Choly    schedule 07.04.2010    source источник
comment
Поскольку я не знаю, я не публикую это как ответ ... но из некоторых примечаний в заголовках видно, что член caplen будет длиной данных.   -  person Mark Wilkins    schedule 07.04.2010
comment
Пакет не будет ASCII, поэтому обработка всех байтов данных как строки ASCII не сработает; в частности, использование strstr() на нем - плохая идея. Прочитайте код в этом руководстве, который обрабатывает пакетные данные как бинарные данные. Ответ Эйнштейна правильный; используйте поле caplen поля struct pcap_pkthdr в качестве количества байтов пакетных данных.   -  person    schedule 15.07.2013


Ответы (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
comment
Нет, это общая длина пакета IPv4; не все пакеты являются пакетами IPv4 (это могут быть пакеты IPv6, пакеты ARP или различные другие типы пакетов), а длина пакета IPv4 в большинстве случаев не равна длине всего пакета в сети — например, для Ethernet также имеется 14-байтовый заголовок Ethernet, и, если длина пакета IPv4 + 14 меньше 60, также имеется трейлер Ethernet, чтобы дополнить пакет до 60 байт (64 байта, если вы включаете CRC) на Сегмент Ethernet. - person ; 15.07.2013
comment
Есть ли способ получить длину пакета с помощью libpcap, независимо от типа пакета (ip, arp, icmp...)? - person tremendows; 16.07.2013
comment
Да — поле len поля struct pcap_pkthdr представляет собой фактическую длину пакета в сети/в эфире (хотя для эфира обратите внимание, что на большинстве платформ, если вы не выполняете захват в режиме монитора, пакеты 802.11 преобразуются в поддельные пакеты Ethernet, а в поле len указана поддельная длина поддельного пакета Ethernet, а не реальная длина пакета 802.11 в эфире). Однако это НЕ обязательно соответствует объему фактических пакетных данных, которые у вас есть в перехваченном файле — это caplen. - person ; 16.07.2013
comment
Не знаю, что делать, я хотел бы удалить свой ответ, потому что он неправильный, но может быть полезен для других людей. - person tremendows; 17.07.2013
comment
Кроме того, пакеты могут иметь псевдозаголовок, содержащий метаданные о пакете, перед фактическим заголовком уровня канала передачи/эфира. Например, пакет, захваченный в режиме монитора на интерфейсе 802.11, может иметь заголовок Radiotap с такой информацией, как мощность сигнала . Если такой заголовок присутствует, значение в caplen и len включает длину заголовка метаданных, а также длину пакета в сети/в эфире. - person ; 30.05.2014