linux - libpcap抓包結果不完整?
問題描述
在ubuntu14.04下使用libpcap抓包,我想得到一段使用http傳輸的html,但是得到的結果和同樣情況下wireshark獲得的數據不一致。
目前代碼如下:
#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('%snn', 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(): %sn', 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;}
服務器有一個簡單的html,我用瀏覽器訪問服務器http://123.206.7.47/test.html時,wireshark(同樣bpf)抓到這樣10個數據包:
我的程序使用調試器看到的卻是這樣的,這個圖對應上圖第四個數據包(大小為474):
為什么unsigned char * packet出現incomplete sequence?還有為什么tcp_data這么短?
是我代碼里libpcap少了什么配置還是其他的原因?
還有一點補充是我訪問其他網站時,偶爾能捕捉到完整的HTTP請求,但是在我訪問的那個網頁上就不行。
問題解答
回答1:已經解決了。直接按caplen讀char就行了,printf('%s')輸出不全似乎是因為某個二進制數據是0被截斷。
相關文章:
1. [python2]local variable referenced before assignment問題2. python小白,關于函數問題3. mysql - 如何在有自增id的情況下,讓其他某些字段能不重復插入4. 求救一下,用新版的phpstudy,數據庫過段時間會消失是什么情況?5. django - Python error: [Errno 99] Cannot assign requested address6. angular.js - 百度支持_escaped_fragment_嗎?7. java - 線上應用,如果數據庫操作失敗的話應該如何處理?8. node.js - win 下 npm install 遇到了如下錯誤 會導致 無法 run dev么?9. python小白 關于類里面的方法獲取變量失敗的問題10. Python2中code.co_kwonlyargcount的等效寫法
