来自ifaddrs.h的getnameinfo()给出了C中的垃圾值

时间:2016-12-17 10:33:39

标签: c network-programming

我想检索我使用的当前无线接口的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

1 个答案:

答案 0 :(得分:0)

问题出在这种情况:

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

我们必须使用AF_PACKET更改AF_INET。这也将允许我们绕过airmon-ngaircrack-ng生成的虚拟接口。

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

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