[使用ioctl在Linux中获取IPv6地址

问题描述 投票:9回答:2

我试图在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不会返回它。

例如,由于仅配置了IPv6地址,因此无法获取followith接口的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)
c linux ipv6 ioctl
2个回答
16
投票

是的,该ioctl是旧版,不会返回IPv6。每个平台都有获取IPv6的不同方法:

  • Linux,如果您发疯了,请使用NETLINK,如果您最近使用的glibc较新,请使用getifaddrs,否则请阅读/proc/net/if_inet6(例如,在Android上。)>
  • Darwin或FreeBSD:使用getifaddrs
  • Solaris,使用SIOCGLIFCONF
  • [AIX,使用SIOCGIFCONF实际返回IPv4和IPv6地址(因为它们实际上可以支持sa_len中的struct sockaddr字段)。

4
投票

使用ioctl在Linux中获取IPv6地址

© www.soinside.com 2019 - 2024. All rights reserved.