在 Linux 网络编程中,获取网络接口的 IPV6 地址可以使用如下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
int main()
{
int skfd;
struct ifreq ifr6;
struct sockaddr_in6 *addr6;
skfd = socket(AF_INET6, SOCK_DGRAM, 0);
strncpy(ifr6.ifr_name, "eth0", IFNAMSIZ);
if (ioctl(skfd, SIOCGIFADDR, &ifr6) == -1) {
perror("ioctl");
exit(EXIT_FAILURE);
}
addr6 = (struct sockaddr_in6 *)&(ifr6.ifr_addr);
char ipv6[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &(addr6->sin6_addr), ipv6, INET_ADDRSTRLEN);
printf("IPv6 address: %s\n", ipv6);
close(skfd);
return 0;
}
与获取 IPV4 地址类似,我们首先需要创建一个 IPv6 套接字,并将网络接口的名称存储在 ifreq 结构体的成员变量 ifr_name 中。然后调用 ioctl 函数向内核发送 SIOCGIFADDR 命令请求获取目标网络接口的 IPV6 地址。
如果命令执行成功,则内核将 IPV6 地址信息填充到 ifreq 结构体中。我们需要将其转换为 sockaddr_in6 类型,并使用 inet_ntop 函数将地址转换为可读格式,最后输出结果即可。
需要注意的是,在实际开发中可能会有多个网络接口存在,因此需要对每个接口进行遍历并获取对应的 IPV6 地址信息。