2011-06-13 3 views
11

모든 네트워크 카드 (두 장의 카드가 있음)의 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를를 사용하여 네트워크 인터페이스에 대한 정보를 나열 할 때/모든 나는

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

사람이 어떻게 IPv6 주소를 나열하는 나를 인도시겠습니까 실제 IPv6 주소는 것을 알 수있다. 감사합니다. .

+1

'FE80는 ::'링크 로컬 범위가 가능 부스트 만 글로벌 범위 주소를 열거 주소입니다. –

답변

7

플랫폼은이 getaddrinfo 그들을 반환하지 않습니다 따라서 어느 쪽도 향상된다는 것을 의미합니다 Windows에서 "SkipAsSource"를 태그로 링크 로컬 인터페이스가 생략되고있는 윈도우 7 SP1 인 경우.

다음과 같은 명령을 사용하여 플래그를 검사하기 위해 시도 할 수

:

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** 
관련 문제