【问题标题】:Get IPv6 addresses in linux using ioctl使用 ioctl 在 linux 中获取 IPv6 地址
【发布时间】:2014-01-11 16:22:04
【问题描述】:

我试图在我的 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)

【问题讨论】:

    标签: c linux ipv6 ioctl


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的澄清,请您帮助我理解“/proc/net/if_inet6”格式,如何确定 UP 和非环回地址?我读了tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-net.html,但不清楚..
    • 文档相当清楚 - 这是您所追求的“接口标志”。查看系统标头 ("if.h") 中 IFF_LOOPBACKIFF_UP 的值。如果您尝试使用 shell 解析 if_inet6,您可以使用 awk 提取正确的字段,然后使用 & 将其与相关常量进行 AND 运算。
    【解决方案2】:

    在 linux 中使用 ioctl 获取 IPv6 地址

    这可能行不通。

    来自man 7 netdevice

    SIOCGIFCONF

    返回接口(传输层)地址列表。这 当前仅表示 AF_INET (IPv4) 系列的地址 为了兼容性。

    [...]

    注意事项

    [...]

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

    【讨论】:

    • 我不能使用 Nicholas Wilson 提出的路由套接字,我需要一个 LSB 兼容的方式,但认为这是不可能的?
    • @Unmanner:如果您需要知道本地绑定套接字的地址,请使用getsockname()。如果您需要找出所有本地接口的地址,请使用getifaddrs() 或读出 Nicholas Wilson 在他的回答中提出的/proc/net/if_inet6
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多