我试图在我的linux操作系统中获取IPv6地址,如下所示:
sd = Socket_m(AF_INET6_m, SOCK_DGRAM_m, 0);
ifc.ifc_buf = buffer_p;
ifc.ifc_len = buffSize;
Ioctl_m(sd, SIOCGIFCONF, &ifc);
如果为接口配置了任何IPv4地址,它会成功运行,但如果接口只有一个IPv6地址,则ioctl不会返回该地址。
例如,我无法获取followith接口的IPv6地址,因为只配置了IPv6地址:
br1 Link encap:Ethernet HWaddr 00:10:18:2D:BB:34
inet6 addr: fe80::210:18ff:fe2d:be54/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:194244850 errors:0 dropped:0 overruns:0 frame:0
TX packets:72005 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:12331900995 (11760.6 Mb) TX bytes:6192406 (5.9 Mb)
答案 0 :(得分:14)
是的,ioctl是遗留的,不会返回IPv6。每个平台都有不同的获取IPv6的方式:
getifaddrs
,否则请阅读/proc/net/if_inet6
(例如在Android上)。getifaddrs
。SIOCGLIFCONF
。SIOCGIFCONF
(因为他们在sa_len
中有一个struct sockaddr
字段,他们实际上可以支持该字段。)答案 1 :(得分:3)
这可能不起作用。
<强> SIOCGIFCONF 强>
返回接口(传输层)地址列表。这个 目前仅指 AF_INET (IPv4)系列的地址 兼容性。
[...]
备注强>
[...]
可以通过/ proc / net或via找到本地IPv6 IP地址 的rtnetlink(7)。