#boost-asio #ipv6
#boost-asio #ipv6
Вопрос:
Я пытаюсь перечислить адреса ipv4 и ipv6 всех сетевых карт (у меня есть 2 карты) на моем компьютере.
Для этого я использую следующий код.
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(boost::asio::ip::host_name(),"");
tcp::resolver::iterator it=resolver.resolve(query);
while(it!=tcp::resolver::iterator())
{
boost::asio::ip::address addr=(it )->endpoint().address();
if(addr.is_v6())
{
std::cout<<"ipv6 address: ";
}
else
std::cout<<"ipv4 address: ";
std::cout<<addr.to_string()<<std::endl;
}
Код отображает правильные адреса ipv4, но не ipv6. Вот результат
ipv6 address: ::1
ipv4 address: 192.168.10.200
ipv4 address: 192.168.10.236
У меня очень минимальные знания об ipv6. Когда я перечисляю информацию о сетевом интерфейсе с использованием ipconfig / all, я вижу, что фактические адреса ipv6 являются
fe80::226:5aff:fe14:5687%5
fe80::225:64ff:feb2:4f61%4
Может кто-нибудь, пожалуйста, подсказать мне, как составить список адресов ipv6.
Спасибо.
Комментарии:
1.
fe80::
это адреса локальной области ссылок, возможно, Boost перечисляет только адреса глобальной области.
Ответ №1:
Если платформой является Windows 7 SP1, локальные интерфейсы ссылок пропускаются, поскольку Windows помечает их как «SkipAsSource«, что означает, что getaddrinfo
они не вернутся и, следовательно, ни один из них не будет повышен.
Вы можете попробовать проверить флаг с помощью следующей команды:
netsh int ipv6 show addresses level=verbose
Address fe80::e0:0:0:0 Parameters
---------------------------------------------------------
Interface Luid : Teredo Tunneling Pseudo-Interface
Scope Id : 0.14
Valid Lifetime : infinite
Preferred Lifetime : infinite
DAD State : Deprecated
Address Type : Other
Skip as Source : **true**