【问题标题】:Finding the correct "network interface" number for IPv6查找 IPv6 的正确“网络接口”编号
【发布时间】:2011-08-21 23:23:00
【问题描述】:

我正在尝试将 Boost 用于某些 IPv6 和多播网络通信。我需要构造一个使用特定网络接口索引的 IPv6 多播套接字。

我能够在 boost/asio/ip/detail/socket_option.hpp 中找到正确的多播选项来设置网络接口索引: 显式多播请求(const boost::asio::ip::address_v6& 多播地址,无符号长网络接口 = 0)

问题是,我不知道如何找到“network_interface”参数的正确值。有没有办法使用我可以提供的本地 IPv6 地址获取 network_interface 值?我查看了文档和示例,但找不到任何东西。

-- 迪伦

【问题讨论】:

    标签: networking boost-asio ipv6


    【解决方案1】:

    每个平台都提供 API 来枚举网络接口,例如getifaddrs 用于许多 Unix,GetAdaptersAddresses 用于 Windows。请注意,在 Windows 上,IPv4 和 IPv6 适配器有一个单独的数字空间,这使得 API 调用 if_nametoindex 相当混乱。

    考虑到 Windows 并没有真正有用的适配器名称,您可能希望检查我在 OpenPGM 中使用的方法的可移植性:

    http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/getifaddrs.c

    http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/nametoindex.c

    http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/indextoaddr.c

    http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/indextoname.c

    【讨论】:

    • 我在linux上使用过if_nametoindex(3)函数,效果很好。即:int interfaceIndex = if_nametoindex("eth0"); socket.set_option(boost::asio::ip::multicast::join_group(address.to_v6(), interfaceIndex));
    【解决方案2】:

    我认为没有一种独立于平台的方法来解决这个问题,就像 no portable solution to enumerating the local addresses 一样。

    在 Linux 上,您可以在/proc/net/if_inet6 的第二列中找到您想要的内容,通过rtnetlink(7) 接口也可以更稳健地使用。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2015-08-28
      • 2012-05-21
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2018-08-13
      相关资源
      最近更新 更多