本文介绍Ubuntu环境下编程获取IPv6地址的实用方法,涵盖C语言socket API与Python socket模块的应用,重点讲解通过getaddrinfo函数解析主机名获取IPv6地址,以及遍历网络接口(如ens33)获取本地IPv6地址的步骤,包括检查接口IPv6状态、使用inet_pton解析地址等,同时强调区分链路本地地址(fe80::/10)与全球单播地址,并提醒处理错误(如地址未启用)和权限问题,帮助开发者高效实现IPv6地址的编程获取。
随着IPv4地址资源的逐渐枯竭,IPv6作为下一代互联网协议的重要性日益凸显,Ubuntu作为广泛使用的Linux发行版,对IPv6提供了良好的支持,在编程开发中,获取本机或目标设备的IPv6地址是网络应用开发的基础环节,本文将详细介绍在Ubuntu环境下,通过多种编程语言获取IPv6地址的方法,并附上实用代码示例和常见问题解决方案。
确保Ubuntu系统已启用IPv6
在开始编程获取IPv6地址前,需确认Ubuntu系统的IPv6已正确启用,默认情况下,Ubuntu 18.04及后续版本已开启IPv6支持,可通过以下命令检查:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
若输出为0,表示IPv6已启用;若为1,则需要修改配置,临时启用可执行:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
永久启用则需编辑/etc/sysctl.conf文件,添加或修改:
net.ipv6.conf.all.disable_ipv6 = 0
保存后执行sudo sysctl -p使配置生效。
编程获取IPv6地址的方法
使用Python获取IPv6地址
Python凭借简洁的语法和丰富的库,成为网络开发的常用语言,以下是两种主流方式:
(1)使用socket模块(基础方法)
socket模块是Python的标准库,可通过getaddrinfo()函数获取地址信息,支持IPv6和IPv4。
import socket
def get_ipv6_addresses():
"""获取本机所有IPv6地址"""
ipv6_addresses = []
try:
# 获取本机所有网络接口的地址信息
hostname = socket.gethostname()
addr_info = socket.getaddrinfo(hostname, None, socket.AF_INET6)
for info in addr_info:
# 提取IPv6地址(过滤掉链路本地地址等,可根据需求调整)
addr = info[4][0]
if not addr.startswith("fe80::"): # 排除链路本地地址
ipv6_addresses.append(addr)
except socket.gaierror as e:
print(f"获取地址信息失败: {e}")
return ipv6_addresses
if __name__ == "__main__":
ipv6_list = get_ipv6_addresses()
if ipv6_list:
print("本机IPv6地址:")
for addr in ipv6_list:
print(addr)
else:
print("未获取到IPv6地址,请检查网络配置。")
说明:
socket.AF_INET6指定IPv6地址族;getaddrinfo()返回的地址信息中,info[4][0]包含IPv6地址;- 通过
startswith("fe80::")可过滤链路本地地址(仅在同一网络段有效),可根据需求保留或删除。
(2)使用netifaces库(推荐,支持多接口)
netifaces是一个第三方库,专门用于获取网络接口信息,支持IPv4、IPv6和MAC地址,功能更强大。
安装netifaces:
pip install netifaces
代码示例:
import netifaces
def get_ipv6_by_interface():
"""按网络接口获取IPv6地址"""
ipv6_dict = {}
try:
# 获取所有网络接口
interfaces = netifaces.interfaces()
for interface in interfaces:
# 获取接口的地址信息
addrs = netifaces.ifaddresses(interface)
if netifaces.AF_INET6 in addrs:
ipv6_list = []
for addr_info in addrs[netifaces.AF_INET6]:
addr = addr_info['addr']
# 排除链路本地地址和回环地址
if not (addr.startswith("fe80::") or addr == "::1"):
ipv6_list.append(addr)
if ipv6_list:
ipv6_dict[interface] = ipv6_list
except Exception as e:
print(f"获取IPv6地址失败: {e}")
return ipv6_dict
if __name__ == "__main__":
ipv6_info = get_ipv6_by_interface()
if ipv6_info:
print("各网络接口的IPv6地址:")
for interface, addrs in ipv6_info.items():
print(f"接口 {interface}: {', '.join(addrs)}")
else:
print("未获取到IPv6地址,请检查网络配置。")
说明:
netifaces.ifaddresses(interface)返回指定接口的地址字典,netifaces.AF_INET6对应IPv6地址;- 通过
addr_info['addr']提取具体地址,可灵活过滤不需要的地址类型(如链路本地、回环地址)。
使用C/C++获取IPv6地址
在C/C++中,可通过getaddrinfo()函数获取IPv6地址,这是POSIX标准推荐的方法,兼容性好。
示例代码(C语言):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
void print_ipv6_addresses() {
struct addrinfo hints, *res, *p;
char ipstr[INET6_ADDRSTRLEN];
int status;
// 设置地址信息过滤条件
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET6; // 仅获取IPv6地址
hints.ai_socktype = SOCK_STREAM; // 流式套接字(可根据需求修改)
// 获取本机地址信息
if ((status = getaddrinfo("localhost", NULL, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo错误: %s\n", gai_strerror(status));
return;
}
printf("本机IPv6地址:\n");
for (p = res; p != NULL; p = p->ai_next) {
void *addr
文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

