2012-02-09 102 views
1

在從libpcap的文檔的示例代碼產生以下代碼應報告(在這種情況下eth0)中的給定接口的IP地址[錯誤檢查爲簡潔起見省略]pcap_lookupnet返回不正確的IP地址

#include <stdio.h> 
#include <pcap.h> 
#include <arpa/inet.h> 

int main(int argc, char *argv[]) 
{ 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    bpf_u_int32 mask; 
    bpf_u_int32 ip;  
    struct in_addr ip_addr; 

    /* Find the properties for the device */ 
    pcap_lookupnet("eth0", &ip, &mask, errbuf); 

    ip_addr.s_addr = ip; 

    printf("IP Address: %s\n", inet_ntoa(ip_addr)); 

    return 0; 
} 

然而,這導致192.168.1.0,而不是正確的192.168.1.100。在另一個不同子網上的另一臺機器上運行此命令會產生10.0.0.0而不是正確的10.0.0.107,這使我相信libpcap並未正確複製最後一個八位字節。我已經手動轉換了pcap_lookupnet返回的整數,以確保它不是使用inet_ntoa時的問題(我也嘗試了inet_ntop,結果相同)。按照此問題的代碼: Get IP address of an interface on Linux 報告正確的IP地址。這是libpcap中的錯誤還是我做錯了什麼?

回答

1

您的聲明「應該報告給定接口的IP地址」不正確。

從手冊頁:

pcap_lookupnet()被用於確定IPv4網絡號碼,並與網絡設備裝置相關聯 掩模 。 netp和maskp都是 bpf_u_int32指針。

您確定您的網絡號分別爲10.0.0.107或192.168.1.100?聽起來很不尋常。

+0

所以我誤解了「網絡號」嚴格意味着主機地址的網絡部分,而不是IP地址?如果是這樣,示例代碼(以及幾本關於pcap編程的書籍)具有很高的誤導性,例如:'bpf_u_int32 net; \t \t/*我們的IP * /' – 2012-02-09 15:42:56

+2

絕對是誤導性的和消息靈通的。假設網絡掩碼爲「m」,IP地址爲「i」,網絡號碼「n」由n = i&m給出。 – mvds 2012-02-09 16:43:28

+0

無論如何你可以解釋這一點嗎?我正在努力解決同樣的問題。 – Jim 2012-12-08 23:16:28