2011-07-08 106 views
0

在這段代碼捕獲數據包,我試圖通過使用inet_ntoa顯示源地址和目標地址,甚至在我以六進制格式打印數據包src和dst地址之前。這裏的問題是兩個不匹配,INET_NTOA的O/P是錯誤的,如圖O/Pinet_ntoa轉換問題

the src ip address should be 172.28.6.87 but inet_ntoa shows 86.212.172.28 
    the src ip address should be 172.28.6.110 but inet_ntoa shows 6.87.172.28 


    char *ptr = NULL; 
    ptr_fltr = (struct packet_filter*)(packet); 
    memcpy(out_data,packet,50); 
    printf("\n"); 
    for(i= 28;i<36;i++) 
    printf("%#x\t",out_data[i]); 
    printf("*******************************************************************\n"); 
    printf("---------------------Received Packet Info--------------------\n"); 
    ptr = inet_ntoa(ptr_fltr->ip.ip_src); 
    printf("Source Ip Addr :%s\n",ptr); 

這裏

struct packet_filter 
    { 
    struct mac_filter mac; 
    struct ip_filter ip; 
    union { 
      struct udp_filter proto; 
    }protocol; 
    }__attribute__((packed)); 


struct ip_filter 
{ 
    u_char ip_vhl; 
    u_char ip_tos; /* type of service */ 
    u_short ip_len; /* total length */ 
    u_short ip_id; /* identification */ 
    u_short ip_off; /* fragment offset field */ 
    u_char ip_ttl; /* time to live */ 
    u_char ip_p; /* protocol */ 
    u_short ip_sum; /* checksum */ 
    struct in_addr ip_src; /* source and dest address */ 
    struct in_addr ip_dst; /* source and dest address */ 
}__attribute__((packed)); 

輸出

0xac 0x1c 0x6 0x57 0xac 0x1c 0x6 0x6e   
    ************************************************************ 
    --------------------Received Packet Info-------------------- 
    Source Ip Addr :86.212.172.28 
    Destination Ip Addr :6.87.172.28 
+0

只是一個問題:爲什麼不使用[libpcap](http://www.tcpdump.org/)? –

回答

2

顯然,你的結構是在您到達IP地址時關閉兩個字節。我檢查了IPv4協議,該位看起來不錯。所以我懷疑struct mac是錯誤的。我認爲struct mac是以太網幀。如果是這樣,它已經有點可疑,因爲Ethernet frame不是固定長度。另外,(假設你從伯克利包過濾器中獲得這些信息),確保你從bpf頭部正確地計算了數據包的開始(你不能依靠sizeof(struct bpf_header))。

0

您的IP數據包從偏移量16開始,如果從ethernet頭複製了struct mac,則它的長度爲14個字節。看起來在數據包中有一些意外的數據。