pcap_lookupnet返回不正确的IP地址
问题描述:
在从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_lookupnet()被用于确定IPv4网络号码,并与网络设备装置相关联 掩模 。 netp和maskp都是 bpf_u_int32指针。
您确定您的网络号分别为10.0.0.107或192.168.1.100?听起来很不寻常。
所以我误解了“网络号”严格意味着主机地址的网络部分,而不是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