【问题标题】:enumerating ipv4 and ipv6 address of my cards using boost asio使用 boost asio 枚举我的卡的 ipv4 和 ipv6 地址
【发布时间】:2011-06-13 06:18:24
【问题描述】:

我正在尝试枚举我的电脑所有网卡(我有 2 个网卡)的 ipv4 和 ipv6 地址。

我正在使用以下代码来执行此操作。

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 地址。 谢谢。

【问题讨论】:

  • fe80:: 是链接本地范围地址,Boost 可能只枚举全局范围地址。

标签: boost-asio ipv6


【解决方案1】:

如果平台是 Windows 7 SP1,链接本地接口将被跳过,因为它们被 Windows 标记为“SkipAsSource”,这意味着getaddrinfo 不会返回它们,因此 Boost 也不会。

您可以尝试使用以下命令检查标志:

netsh int ipv6 show addresses level=verbose

Address fe80::e0:0:0:0%14 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**

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2018-07-23
    • 2023-04-01
    相关资源
    最近更新 更多