Linux - Die Ergebnisse der libpcap-Paketerfassung sind unvollständig?
伊谢尔伦
伊谢尔伦 2017-05-16 13:24:16
0
1
605

Wenn ich libpcap zum Erfassen von Paketen unter Ubuntu 14.04 verwende, möchte ich einen Teil des HTML-Codes über http übertragen lassen, aber die erhaltenen Ergebnisse stimmen nicht mit den Daten überein, die wireshark unter derselben Situation erhalten hat.

Der aktuelle Code lautet wie folgt:

#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;
}

Der Server verfügt über ein einfaches HTML. Wenn ich über den Browser auf den Server http://123.206.7.47/test.html zugreife, erfasst Wireshark (wie BPF) 10 Pakete wie dieses:

Mein Programm sieht bei Verwendung des Debuggers so aus. Dieses Bild entspricht dem vierten Paket (Größe 474) im Bild oben:

Warum erscheint das unsigned char *-Paket als unvollständige Sequenz? Und warum ist tcp_data so kurz?

Fehlt in meinem Code eine Konfiguration von libpcap oder liegt das an anderen Gründen?

Eine weitere Sache, die ich hinzufügen möchte, ist, dass ich beim Besuch anderer Websites gelegentlich die vollständige HTTP-Anfrage erfassen kann, jedoch nicht auf der von mir besuchten Webseite.

伊谢尔伦
伊谢尔伦

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

Antworte allen(1)
为情所困

已经解决了。直接按caplen读char就行了,printf("%s")输出不全似乎是因为某个二进制数据是\0被截断。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!