recherche

Maison  >  Questions et réponses  >  le corps du texte

linux - Les résultats de la capture de paquets libpcap sont incomplets ?

En utilisant libpcap pour capturer des paquets sous Ubuntu14.04, je souhaite obtenir un morceau de code HTML transmis via http, mais les résultats obtenus ne sont pas cohérents avec les données obtenues par Wireshark dans la même situation.

Le code actuel est le suivant :

#include <pcap.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <string.h>
#include <netinet/in.h>

void getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet)
{

    bpf_u_int32 caplen = pkthdr->caplen;
    bpf_u_int32 len = pkthdr->len;

    int * id = (int *)arg;

    struct iphdr *ip_header = (struct iphdr *)(packet + ETH_HLEN);
    struct tcphdr *tcp_header = (struct tcphdr *)(packet + ETH_HLEN + sizeof(struct iphdr));

    const u_char *tcp_data = packet + ETH_HLEN + sizeof(struct iphdr) + sizeof(struct tcphdr);

    printf("%s\n\n", tcp_data);
}

int main()
{
    char errBuf[PCAP_ERRBUF_SIZE];
    pcap_t * device = pcap_open_live("wlan0", 65535, 1, 0, errBuf);

    if(!device)
    {
        printf("错误: pcap_open_live(): %s\n", errBuf);
        exit(1);
    }

    struct bpf_program filter;
    pcap_compile(device, &filter, "tcp port 80 and host 123.206.7.47", 1, 0);
    pcap_setfilter(device, &filter);

    int id = 0;

    pcap_loop(device, -1, getPacket, (u_char*)&id);
    pcap_close(device);

    return 0;
}

Le serveur a un simple html Lorsque j'utilise le navigateur pour accéder au serveur http://123.206.7.47/test.html, wireshark (identique à bpf) capture 10 paquets comme ceci :

Mon programme ressemble à ceci lors de l'utilisation du débogueur. Cette image correspond au quatrième paquet (taille 474) dans l'image ci-dessus :

Pourquoi le paquet char * non signé apparaît-il dans une séquence incomplète ? Et pourquoi tcp_data est-il si court ?

Y a-t-il une configuration manquante de libpcap dans mon code ou est-ce dû à d'autres raisons ?

Une autre chose à ajouter est que lorsque je visite d'autres sites Web, je peux occasionnellement capturer la requête HTTP complète, mais pas sur la page Web que j'ai visitée.

伊谢尔伦伊谢尔伦2749 Il y a quelques jours662

répondre à tous(1)je répondrai

  • 为情所困

    为情所困2017-05-16 13:26:16

    Déjà résolu. Appuyez simplement sur caplen pour lire char, printf("%s")输出不全似乎是因为某个二进制数据是 sera tronqué.

    répondre
    0
  • Annulerrépondre