Menggunakan libpcap untuk menangkap paket di bawah ubuntu14.04, saya ingin mendapatkan sekeping html yang dihantar menggunakan http, tetapi keputusan yang diperolehi tidak konsisten dengan data yang diperoleh oleh wireshark dalam situasi yang sama.
Kod semasa adalah seperti berikut:
#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;
}
Pelayan mempunyai html mudah Apabila saya menggunakan pelayar untuk mengakses pelayan http://123.206.7.47/test.html, wireshark (sama seperti bpf) menangkap 10 paket seperti ini:
Program saya kelihatan seperti ini apabila menggunakan penyahpepijat Gambar ini sepadan dengan paket keempat (saiz 474) dalam gambar di atas:
Mengapa paket char * yang tidak ditandatangani kelihatan urutan yang tidak lengkap? Dan mengapa tcp_data sangat pendek?
Adakah terdapat beberapa konfigurasi libpcap yang hilang dalam kod saya atau adakah ia disebabkan oleh sebab lain?
Satu lagi perkara yang perlu ditambah ialah apabila saya melawat tapak web lain, saya kadang-kadang boleh menangkap permintaan HTTP yang lengkap, tetapi tidak pada halaman web yang saya lawati.
Sudah diselesaikan. Hanya tekan caplen untuk membaca char,
printf("%s")
输出不全似乎是因为某个二进制数据是