linux - Les résultats de la capture de paquets libpcap sont incomplets ?
伊谢尔伦
伊谢尔伦 2017-05-16 13:24:16
0
1
604

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.

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

répondre à tous(1)
为情所困

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!