使用ioctl在linux中获取IPv6地址

Yur*_*hev 9 c linux ioctl ipv6

我试图在我的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);
Run Code Online (Sandbox Code Playgroud)

如果为接口配置了任何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)
Run Code Online (Sandbox Code Playgroud)

Nic*_*son 15

是的,ioctl是遗留的,不会返回IPv6.每个平台都有不同的获取IPv6的方式:

  • Linux,如果你疯了就使用NETLINK,getifaddrs如果你有一个模糊的近期glibc,请使用,否则阅读/proc/net/if_inet6(例如在Android上).
  • 达尔文或FreeBSD:使用getifaddrs.
  • Solaris,使用SIOCGLIFCONF.
  • AIX,使用SIOCGIFCONF它实际返回IPv4和IPv6地址(因为他们有一个sa_len字段,struct sockaddr他们实际上可以支持它).


alk*_*alk 5

在Linux中使用ioctl获取IPv6地址

这可能行不通。

man 7 netdevice

SIOCGIF会议

返回接口(传输层)地址列表。目前,这仅意味着AF_INET (IPv4) 系列的地址具有兼容性。

[...]

笔记

[...]

本地 IPv6 IP 地址可以通过 /proc/net 或通过 rtnetlink(7) 找到。