Я работаю с 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-запросы и ответы. Есть ли какой-нибудь правильный и аккуратный способ сделать это?
Это связано с тем, что выходные данные представляют собой необработанные двоичные данные, а не строку ascii, поэтому printf выводит их только до первого 0 байтов. Чтобы напечатать все читаемые материалы в пакете, используйте что-то вроде:
for (int i = 0; i < header->caplen; ++i) {
if (isascii(packet[i])) {
putchar(packet[i]);
} else {
putchar('.');
}
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