c - 如何使用 IPv6 了解 C 中接口(interface)的 IP 地址

标签 c linux interface ipv6 ipv4

假设我想要按接口(interface)名称列出 Linux 计算机上的所有 IP 地址,同时使用 IPv6IPv4 .

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

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

最佳答案

我的 C 非常生锈,并且成员包含 union 的结构(如 struct sockaddr_in6 )不再适合我的大脑,所以按照最好的剪切和粘贴传统,我改编了 chrisaycock's answer (枚举系统的 IPv4 地址)使用 getnameinfo()相反,在 getifaddrs() 的帮助下手册页(有更好的示例):

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

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

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

  for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr && 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;
}

我的系统上的输出:

Interface: lo   Address: ::1
Interface: br0  Address: fdbf:e684:d5fb:6:6e62:6dff:fed1:dfad
Interface: br0  Address: 2001:db8:1f80:81c6:6e62:6dff:fed1:dfad
Interface: br0  Address: fe80::6e62:6dff:fed1:dfad%br0
Interface: virbr1       Address: fe80::5054:ff:fece:bfec%virbr1
Interface: virbr0       Address: fe80::5054:ff:fef9:c92e%virbr0
Interface: virbr2       Address: fe80::5054:ff:fedd:ea18%virbr2
Interface: vnet0        Address: fe80::fc54:ff:fe90:de19%vnet0
Interface: vnet1        Address: fe80::fc54:ff:fede:b69c%vnet1

记住为所有内容添加错误检查;本示例中省略了一些错误检查。

关于c - 如何使用 IPv6 了解 C 中接口(interface)的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27420500/

相关文章:

linux - 如何检测将运行哪个程序?

interface - 如何在 D 接口(interface)中有意义地使用前置条件契约?

go - 如何制作一个只允许整数的接口(interface)?

c - 这个简单的代码有什么问题?

c - 未获得三元运算符的预期输出

linux - 如何在行尾负 1 位置添加带有 sed 的文本

linux命令行使用提供的参数重命名所有文件

c - 如何使用 cppcheck 在控制台中的项目中执行?,也许在 makefile 中搜索引用?

c - 为什么一段代码在迭代一定次数后会一直不停地运行?

java - 接口(interface)和同类产品