如何使用IPv6了解C中接口的IP地址

时间:2014-12-11 10:24:34

标签: c linux interface ipv6 ipv4

假设我希望我的Linux机器上的所有IP地址都按其接口名称列出,同时使用IPv6IPv4

我能找到的最佳建议是使用支持IPv6的getifaddrs(),类似于here的帖子。 但是,getifaddrs()使用struct ifaddrs,它使用与IPv6不兼容的struct sockaddr。相反,它也应该是一个指向结构in6_addr的联合的指针。

这是如何处理的? getifaddrs()如何支持IPv6?文档是否过时了?

1 个答案:

答案 0 :(得分:2)

我的C非常生锈,与含有联合的成员(如struct sockaddr_in6)结构不再适合我的大脑,所以在最好的剪切和粘贴传统中我改编chrisaycock's answer使用{{1相反,在getnameinfo()手册页(有一个更好的例子)的帮助下:

getifaddrs()

我系统上的输出:

#define _GNU_SOURCE    # required for NI_NUMERICHOST
#include <arpa/inet.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <netdb.h>

int main ()
{
  struct ifaddrs *ifap, *ifa;
  struct sockaddr_in6 *sa;
  char addr[INET6_ADDRSTRLEN];

  getifaddrs (&ifap);
  for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr->sa_family==AF_INET6) {
      sa = (struct sockaddr_in6 *) ifa->ifa_addr;
      getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), addr,
                  sizeof(addr), NULL, 0, NI_NUMERICHOST);
      printf("Interface: %s\tAddress: %s\n", ifa->ifa_name, addr);
    }
  }

  freeifaddrs(ifap);
  return 0;
}

请记住向所有内容添加错误检查;它已从此示例中省略。