我的第一個賭注是GetIpAddrTable()
,因爲有樣本代碼,但它只支持IPv4。然後我嘗試了GetAdaptersInfo()
,但文檔表明它已被GetAdaptersAddresses()
廢棄。我應該使用任何代碼示例來使用GetAdaptersAdresses()或任何其他IP Helper API獲取網絡掩碼?什麼是IPHelper API來檢索網絡掩碼信息?
0
A
回答
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;
}
相關問題
- 1. 在Python中檢索網絡掩碼
- 2. Android檢索當前網絡信息
- 3. 檢索GSM網絡信息Android?
- 4. 網絡中掩碼可能的長度是什麼
- 5. 將網絡/掩碼與另一個網絡/掩碼比較
- 6. 有誰知道一個java組件來檢查IP地址是否來自特定的網絡/網絡掩碼?
- 7. 驗證IPv6網絡掩碼
- 8. 通過網絡掩碼
- 9. 轉換網絡掩碼php
- 10. 優化調用來檢索掩碼數組的掩碼元素的索引?
- 11. 什麼是掩碼值?
- 12. 有效網絡掩碼的c代碼
- 13. T-Sql:檢查IP是否與網絡掩碼匹配
- 14. 檢查IP是否在CIDR網絡掩碼(範圍)
- 15. 從網絡上自動檢索一些信息
- 16. 有關網絡發現API的信息
- 17. Playstation網絡API獲取信息?
- 18. 爲什麼Net :: IP中的網絡掩碼錯誤?
- 19. 非順序網絡掩碼意味着什麼
- 20. PHP檢索位掩碼值
- 21. 爲什麼路由表中的路由項(通過netlink套接字獲取)沒有網絡掩碼信息?
- 22. 檢查CPU,內存,網絡,NAT表使用信息的API
- 23. Google+ API檢索個人資料信息
- 24. 什麼是最好的網絡圖像搜索API?
- 25. 檢索OS X中的網絡用戶信息
- 26. 如何從XCode,iPhone中檢索蜂窩網絡信息?
- 27. 什麼應該是網站的結構來檢索電報中的網站信息?
- 28. 替代從圖形API檢索信息
- 29. 的ASP.NET Web API - SQL - 檢索信息
- 30. 掩蓋信號的原因是什麼?
這裏更多細節:http://stackoverflow.com/questions/3679652/is-ip-address-on-the-same-subnet-as-the-local-machine-with-ipv6-support – selbie
感謝你的回答。網絡掩碼或前綴對我來說都可以。我目前的實現是遍歷FirstPrefix並找到匹配的,即每個IP_ADAPTER_ADDRESSES的「主機IP地址前綴」,並使用它的PrefixLen。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366058%28v=vs.85%29.aspx。 –
這聽起來很合理。昨晚我掃描文檔時沒看到FirstPrefix。 – selbie