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

时间:2011-05-09 20:23:44

标签: networking boost-asio ipv6

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

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

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

- 迪伦

2 个答案:

答案 0 :(得分:3)

每个平台都提供API来枚举网络接口,例如:许多Unix getifaddrs和Windows GetAdaptersAddresses。请注意,在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

答案 1 :(得分:2)

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

在Linux上,您可以在/proc/net/if_inet6的第二列找到您想要的内容,该内容也可以通过rtnetlink(7)界面更加健壮地使用。