2013-01-02 42 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,「NetMask」的概念與IPv4中的概念不同。 See here for more details。您是否注意到當您從命令行鍵入「ipconfig」或嘗試從控制面板手動設置IPv6地址時,顯示沒有顯示「網絡掩碼」字段?

因此,您可以使用SIO_GET_INTERFACE_LIST或GetIpAddrTable來查找IPv4接口的網絡掩碼。但是對於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