2012-02-09 183 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