c - pcap_lookupnet 返回错误的 IP 地址

标签 c linux libpcap

以下来自 libpcap 文档的示例代码生成以下代码,该代码应报告给定接口(interface)的 IP 地址(本例中为 eth0)[为简洁起见,省略了错误检查]

#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 中的错误还是我做错了什么?

最佳答案

您的陈述“应报告给定接口(interface)的 IP 地址”不正确。

来自联机帮助页:

pcap_lookupnet() is used to determine the IPv4 network number and mask associated with the network device device. Both netp and maskp are bpf_u_int32 pointers.

您确定您的网络号分别为 10.0.0.107 或 192.168.1.100 吗?听起来很不寻常。

关于c - pcap_lookupnet 返回错误的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9213828/

相关文章:

linux - 使用 'grep - i *.sh' 和 'grep -i .sh' 的输出差异。请解释一下这个异常?

c - 如何检查 libpcap 中的数据包可用性

c++ - Libpcap : some CNAMEs seems missing TLD解析CNAME问题

c - fork()的执行过程

c - fork() 阻塞父进程

c - 需要 JPEG 或其他有损图像压缩库

c - 逐个字符打印标准输入直到文件末尾

c - 为什么这个内存吞噬者真的不吃内存?

linux - 如何通过命令行清除浏览器缓存

linux - 捕获数据包的网络和传输层功能