使用ioctl在linux中获取IPv6地址

使用ioctl在linux中获取IPv6地址,c,linux,ipv6,ioctl,C,Linux,Ipv6,Ioctl,我尝试在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地址,因为只配置了IPv6地址: br1

我尝试在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地址,因为只配置了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)
使用ioctl在linux中获取IPv6地址

这可能行不通

发件人:

SIOCGIFCONF

返回接口(传输层)地址列表。这 当前仅指自动网络(IPv4)系列的地址 为了兼容性

[……]

注释

[……]

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


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

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

我不能像Nicholas Wilson建议的那样使用路由套接字,我需要一种与LSB兼容的方式,但似乎这是不可能的?@Unmanner:如果您需要知道套接字在本地绑定到的地址,请使用
getsockname()
。如果您需要查找所有本地接口的地址,请使用Nicholas Wilson在其回答中提出的
getifaddrs()
或读取
/proc/net/If_inet6
。非常感谢您的澄清,请您帮助我理解“/proc/net/If_inet6”格式,我如何确定上行和非回送地址?我读了,但不清楚。文档相当清楚-你要的是“接口标志”。查看系统标题(“if.h”)中有关
IFF\u环回
IFF\u UP
的值。如果您试图使用shell解析If_inet6,可以使用awk提取正确的字段,并使用
&
将其与相关常量一起提取。