假设我希望我的Linux机器上的所有IP地址都按其接口名称列出,同时使用IPv6和IPv4。
我能找到的最佳建议是使用支持IPv6的getifaddrs(),类似于here的帖子。 但是,getifaddrs()使用struct ifaddrs,它使用与IPv6不兼容的struct sockaddr。相反,它也应该是一个指向结构in6_addr的联合的指针。
这是如何处理的? getifaddrs()如何支持IPv6?文档是否过时了?
答案 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;
}
请记住向所有内容添加错误检查;它已从此示例中省略。