2013-01-02 5 views
0

예제 코드가 있기 때문에 처음으로 내기가 GetIpAddrTable() 이었지만 IPv4 만 지원합니다. 그런 다음 GetAdaptersInfo()을 시도했지만 문서에서는 GetAdaptersAddresses()으로 폐기되었습니다. GetAdaptersAdresses() 또는 다른 IP Helper API를 사용하여 넷 마스크를 얻으려면 어떤 코드 샘플을 사용해야합니까?넷 마스크 정보를 검색 할 IPHelper API 란 무엇입니까?

답변

1

IPv4의 경우 AF_INET 소켓 및 SIO_GET_INTERFACE_LIST 플래그로 WSAIoctl을 호출 할 수 있습니다. 이렇게하면 IP, 넷 마스크 및 브로드 캐스트 주소 집합을 포함하는 INTERFACE_INFO 구조체 배열이 반환됩니다. 아래 샘플 코드를 참조하십시오.

IPv6의 경우 "넷 마스크"개념은 IPv4에서와 같은 방식으로 적용되지 않습니다. See here for more details. 명령 줄에서 "ipconfig"를 입력하거나 제어판에서 수동으로 IPv6 주소를 설정하려고 할 때 "netmask"필드가 표시되지 않는 것을 확인 했습니까?

그래서 IPv4 인터페이스의 넷 마스크로 SIO_GET_INTERFACE_LIST 또는 GetIpAddrTable을 사용할 수 있습니다. 그러나 IPv6의 경우, 아마도 당신이 그 정보로 무엇을 하려는지에 대해 정성을 기울여야 할 것입니다.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    WSAData data = {}; 
    sockaddr_in addrLocal = {}; 
    INTERFACE_INFO infolist[100] = {}; 
    DWORD dwBytesReturned = 0; 
    DWORD dwNumInterfaces = 0; 

    ::WSAStartup(MAKEWORD(2,2), &data); 
    int s = socket(AF_INET, SOCK_DGRAM, 0); 
    int result = WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, (void*)infolist, sizeof(infolist), &dwBytesReturned, NULL, NULL); 
    dwNumInterfaces = dwBytesReturned/sizeof(INTERFACE_INFO); 

    for (DWORD index = 0; index < dwNumInterfaces; index++) 
    { 
     char szIP[120]={}; 
     char szBroadcast[120]={}; 
     char szNetMask[120]={}; 

     if (infolist[index].iiAddress.Address.sa_family == AF_INET) 
     { 
      // ipv4 
      sockaddr_in* pAddr4 = &infolist[index].iiAddress.AddressIn; 
      inet_ntop(AF_INET, &pAddr4->sin_addr, szIP, ARRAYSIZE(szIP)); 

      pAddr4 = &infolist[index].iiBroadcastAddress.AddressIn; 
      inet_ntop(AF_INET, &pAddr4->sin_addr, szBroadcast, ARRAYSIZE(szBroadcast)); 

      pAddr4 = &infolist[index].iiNetmask.AddressIn; 
      inet_ntop(AF_INET, &pAddr4->sin_addr, szNetMask, ARRAYSIZE(szNetMask)); 
     } 
     else 
     { 
      continue; 
     } 

     printf("IP:%s NetMask:%s Broadcast:%s\n", szIP, szNetMask, szBroadcast); 
    } 

    return 0; 
} 
+0

자세한 내용 여기 : http://stackoverflow.com/questions/3679652/is-ip-address-on-the-same-subnet-as-the-local-machine-with-ipv6-support – selbie

+0

답변 해주셔서 감사합니다. 넷 마스크 또는 접두사는 나를 위해 괜찮을 것입니다. 현재 구현은 FirstPrefix를 반복하며 IP_ADAPTER_ADDRESSES 당 "호스트 IP 주소 접두사"와 일치하는 접두어를 찾고 PrefixLen을 사용합니다. http://msdn.microsoft.com/en-us/library/windows/desktop/aa366058%28v=vs.85%29.aspx. –

+0

합리적인 것 같습니다. 나는 지난 밤에 문서를 스캔했을 때 FirstPrefix를 보지 못했습니다. – selbie