在从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中的错误还是我做错了什么?
所以我误解了“网络号”严格意味着主机地址的网络部分,而不是IP地址?如果是这样,示例代码(以及几本关于pcap编程的书籍)具有很高的误导性,例如:'bpf_u_int32 net; \t \t/*我们的IP * /' – 2012-02-09 15:42:56
绝对是误导性的和消息灵通的。假设网络掩码为“m”,IP地址为“i”,网络号码“n”由n = i&m给出。 – mvds 2012-02-09 16:43:28
无论如何你可以解释这一点吗?我正在努力解决同样的问题。 – Jim 2012-12-08 23:16:28