我正在尝试使用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)
界面更强大地获得。