Чтение пакетных данных с помощью libpcap

Я работаю с pcap для мониторинга http запросов и ответов. Я настроил pcap_loop и получаю пакеты в моей функции обратного вызова, но я не знаю, как читать содержимое пакетов.
это моя функция обратного вызова:

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
printf("%s\n", packet);
}

Вывод всегда выглядит как серия обратной косой черты и три числа после нее

\ 200 \ 205 \ 300

Мне было интересно, как я могу сделать содержимое читабельным, чтобы я мог найти и обработать http-запрос и ответы?

ОБНОВИТЬ:

Моя цель — прочитать HTTP-запросы и ответы. Есть ли какой-нибудь правильный и аккуратный способ сделать это?

0

Решение

Это связано с тем, что выходные данные представляют собой необработанные двоичные данные, а не строку ascii, поэтому printf выводит их только до первого 0 байтов. Чтобы напечатать все читаемые материалы в пакете, используйте что-то вроде:

for (int i = 0; i < header->caplen; ++i) {
if (isascii(packet[i])) {
putchar(packet[i]);
} else {
putchar('.');
}
4

Другие решения

Libpcap предоставит вам необработанный пакет, включая все заголовки. Вам нужно извлечь из него нужные данные, я предлагаю привести их к стандартным структурам, представляющим пакет. Что-то вроде,

/* Start with the ether header */
ethernet = (struct ether_header *) packet;

/* Do a couple of checks to see what packet type we have */
if (ntohs (ethernet->ether_type) == ETHERTYPE_IP)
{
// Cast it to an IP packet struct
ip_hdr = (struct ip*)(packet + sizeof(struct ether_header));

//If TCP...
if(ip_hdr->ip_p == 6)
{
packet_info.tcp_hdr = *(struct tcphdr*)((char*)ip_hdr + sizeof(struct ip));
// Work on extracting the actual data for HTTP stuff over here
2

По вопросам рекламы [email protected]