2012-01-27 101 views
0

我與PCAP庫工作,我試圖捕捉源和目的IP地址,但它似乎是給了我完全隨機的結果:組in_addr隨機結果

這裏是我的結構:

struct sniff_ip { 
    u_char ip_vhl; 
    u_char ip_tos; 
    u_short ip_len; 
    u_short ip_id; 
    u_short ip_off; 
    u_char ip_ttl; 
    u_char ip_p; 
    u_short ip_sum; 
    struct in_addr ip_src, ip_dst; 
}; 

下面是一個使用該結構的相關代碼:

void print_payload(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet) 
{ 
    const struct sniff_ip *ip; 
    int i=0; 
    static int count=0; 

    ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); 
    printf("Source [%s] - Destination [%s]\n", inet_ntoa(ip->ip_src), inet_ntoa(ip->ip_dst)); 
    printf("Payload:\n"); 
    for(i=0; i<pkthdr->len; i++) 
    { 
    if(isprint(packet[i])) 
     printf("%c", packet[i]); 
    else 
     printf(".", packet[i]); 
    if((i%16 == 0 && i != 0) || (i== pkthdr->len-1)) 
     printf("\n"); 
    } 
} 

輸出是:

Source [207.117.127.0] - Destination [207.117.127.0] 
Payload: 
................E 
..<[email protected]@..u..... 
[email protected] 
[email protected] 
1\......... 
Source [60.190.127.0] - Destination [60.190.127.0] 
Payload: 
................E 
..([email protected]@.<...... 
[email protected] 
...wN.. 

IP地址似乎是完全隨機的,不是我的。預期的輸出將顯示我自己的IP來源和目標,因爲我正在通過連接到自己來測試它。我在端口23上運行它,以避免任何其他數據干擾。

編輯:我得到它的工作,出於某種原因,我必須telnet到「eth0」,而不是「本地」,它的工作。但是,一旦我將端口更改爲更有用的端口,如端口80,它工作正常。我不確定端口23爲什麼不同,但是很好。

回答

3

inet_ntoa返回指向其內部緩衝區的指針,所以在一次調用printf時不太可能使用兩個inet_ntoa,並希望得到不同的結果。

+0

啊,是的,你說得對。儘管我將它們移到了自己的行中,但現在它提供了兩個不同的IP: 來源[60.190.127.0]目標[0.1.127.0] – zoite 2012-01-27 12:07:31

+0

使用'inet_ntop'的更多原因。 – 2012-01-27 13:38:23

+0

或者最好''getnameinfo'帶'NI_NUMERICHOST',這樣你就不必在任何地址內部戳。 – 2012-01-27 13:49:33