c - ifaddrs.h 中的 getnameinfo() 给出了 C 中的垃圾值

标签 c network-programming

我想检索我当前使用的无线接口(interface)的 IP 地址。为此,我使用 ifaddrs.h 中的 getnameinfo() 函数图书馆。我的问题是这个函数返回垃圾值而不是实际的 IP 地址。

这是我使用的函数:

void getWIFromSystem(WI **WIHead) {
  struct ifaddrs *ifaddr, *ifa;
  char host[NI_MAXHOST];

  if (getifaddrs(&ifaddr) == -1) {
    perror("getifaddrs");
    exit(-1);
  }

  /* Walk through linked list, maintaining head pointer so we
     can free list later */
  for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET) {
      continue;
    }

    if (check_wireless(ifa->ifa_name)) { / /we want only wireless interfaces
      //getWIAdress(ifa->ifa_name, host);
      getnameinfo(ifa->ifa_addr, (ifa->ifa_addr->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
      addWI(&WIHead, ifa->ifa_name, host);
    }
  }

  freeifaddrs(ifaddr);
}

我设法用我创建的另一个函数解决了这个问题,但我不明白为什么我使用 getnameinfo() 得到垃圾值

我解决问题的其他功能:

void getWIAdress(char *name, char *host) {
   int fd;
   struct ifreq ifr;

   fd = socket(AF_INET, SOCK_DGRAM, 0);

   /* I want to get an IPv4 IP address */
   ifr.ifr_addr.sa_family = AF_INET;

   /* I want IP address attached to specified name */
   strncpy(ifr.ifr_name, name, IFNAMSIZ-1);

   ioctl(fd, SIOCGIFADDR, &ifr);

   close(fd);

   /* copy result */
   strcpy(host, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
}

垃圾值的屏幕截图:

enter image description here

最佳答案

问题是在这种情况下:

if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET)

我们必须将 AF_PACKET 更改为 AF_INET。这还允许我们绕过由 aircrack-ng 包中的 airmon-ng 生成的虚拟接口(interface)。

通过上述修复,我们也不必在 getnameinfo() 中检查 AF_INET,因为我们坚持使用 IPv4 地址。

getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

关于c - ifaddrs.h 中的 getnameinfo() 给出了 C 中的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41197650/

相关文章:

c - 试图将摩尔斯电码转换为英语。挣扎

c - 如何获取 ifr_hwaddr.sa_data 到 char

使用 swap context() 和自定义 yield 函数进行上下文切换

python - 了解 ping 延迟

c - 获取 ToS 字节的 BSD(或可移植)方式是什么(如来自 linux 的 IP_RECVTOS)?

c# - 如何使用 MciSendString 在 C# 中选择用于录制的音频设备

c - 我应该收到此错误 : variable-sized object may not be initialized?

c# - 比较通过 NetworkStream 发送到服务器/从服务器发送的值

c++ - C++ boost::asio::ip::tcp::acceptor有时不接受连接器?

c++ - 我应该使用哪个 TLS 库,可移植性是个问题