2012-09-27 147 views
0

我正在使用pcap來監視http請求和響應。我設置了pcap_loop,並且在回調函數中獲取數據包,但我不知道如何讀取數據包內容。 這是我的回調函數:使用libpcap讀取數據包數據

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) 
{ 
    printf("%s\n", packet); 
} 

輸出看起來總是喜歡系列backslashe和三個數字後

\ 200 \ 205 \ 300

我不知道我該怎麼做內容可讀,所以我可以找到並處理http請求和響應?

UPDATE:

我的目標是讀取HTTP請求和響應是有這樣做的任何適當的和簡潔的方式?

回答

4

這是因爲輸出是原始二進制數據,而不是ascii字符串,所以printf只輸出它直到第一個0字節。要打印數據包中所有可讀的東西,請使用類似於:

for (int i = 0; i < header->caplen; ++i) { 
    if (isascii(packet[i])) { 
     putchar(packet[i]); 
    } else { 
     putchar('.'); 
    } 
+0

謝謝你的回答,但我正在尋找一種方法來分離HTTP內容。 –

2

Libpcap將爲您提供原始數據包,包括所有標頭。您需要從中提取出您需要的數據,我建議將其轉換爲表示數據包的標準結構。類似的,

/* Start with the ether header */ 
ethernet = (struct ether_header *) packet; 

/* Do a couple of checks to see what packet type we have */ 
if (ntohs (ethernet->ether_type) == ETHERTYPE_IP) 
{ 
      // Cast it to an IP packet struct 
    ip_hdr = (struct ip*)(packet + sizeof(struct ether_header)); 

    //If TCP... 
    if(ip_hdr->ip_p == 6) 
    { 
       packet_info.tcp_hdr = *(struct tcphdr*)((char*)ip_hdr + sizeof(struct ip)); 
       // Work on extracting the actual data for HTTP stuff over here 
+0

我試過了,但沒有奏效。 –