查找 IPv6 的正确"网络接口"编号



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

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

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

--迪伦

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

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

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上,您可以在第二列中找到所需的内容 /proc/net/if_inet6 ,也可以通过rtnetlink(7)界面更强大地获得。

最新更新