2011-07-13 131 views
1

所以我最近一直在玩libpcap,並且我有一個簡單的問題。這裏是有問題的代碼:使用libpcap解釋有效載荷

while((result = pcap_next_ex(adapterHandle, &header, &packetData)) >= 0) 
{ 
    if(result == 0) // Packet was dropped 
     continue; 


    ethernet = (struct sniff_ethernet*)packetData; 
    ip = (struct sniff_ip*)(packetData + SIZE_ETHERNET); 
    size_ip = IP_HL(ip)*4; 
    ip_len = ntohs(ip->ip_len); 

    if(ip->ip_p != IPPROTO_TCP) 
     continue; 

    tcp = (struct sniff_tcp*)(packetData + SIZE_ETHERNET + size_ip); 
    size_tcp = TH_OFF(tcp)*4; 
    if(size_tcp < 20) 
    { 
     cout << "Invalid TCP Header" << endl; 
     exit(-1); 
    } 

    payload = (u_char*)(packetData + SIZE_ETHERNET + size_ip + size_tcp); 
    size_payload = ip_len - (size_ip + size_tcp); 

    cout << "************** Output A ******************" << endl; 
    cout << payload << endl; 
    cout << "*************** Output B *****************" << endl; 
    for(int i=0; i<size_payload; i++) 
     cout << payload[i]; 
} 

所以在我的測試中,我設置它,以便我只捕獲HTTP「GET」請求。現在我認爲輸出A和輸出B的輸出應該是相同的,只打印HTTP頭。輸出B總是正確地打印出來,但是輸出A偶爾也會有HTTP頭和大約7個字節的隨機文本(就像這個「ï╤↔N↓ƒ♂」)。

所以問題是從哪裏出現亂碼的文本?直接在輸出A中打印有效負載與在輸出B中循環打印每個字符之間有什麼區別?

回答

2

那麼,如果它不是NUL - 終止(\0)它不會知道在哪裏停止,所以它會打印垃圾文本。你可能想這樣做:

payload[size_payload] = '\0'; /* Before using it. */ 
+0

Doh!愚蠢的錯誤我是我的一部分。像魅力一樣工作。謝謝您的幫助! – Tom