2011-06-13 52 views
11

我想枚舉所有網卡(我有2卡)的ipv4和ipv6地址我的電腦。使用boost asio枚舉我的卡的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列出有關網絡接口的信息/我所看到的,實際的IPv6地址

fe80::226:5aff:fe14:5687%5 
fe80::225:64ff:feb2:4f61%4 

是否有人可以指導我如何列出IPv6地址。 謝謝。

+1

'FE80 ::'是鏈路本地地址範圍內有可能加速僅列舉了全球範圍內的地址。 – 2011-06-13 14:36:46

回答

7

如果平臺是Windows 7 SP1,因爲他們的標籤爲「SkipAsSource」的Windows,這意味着getaddrinfo不會回到他們因此也不會助推鏈路本地接口被跳過。

你可以嘗試用下面的命令來檢查標誌:

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** 
相關問題