我的第一个赌注是GetIpAddrTable()
有示例代码,但它只支持 IPv4。然后我尝试 GetAdaptersInfo()
了,但文件表明它已被GetAdaptersAddresses()
. 我应该使用任何使用 GetAdaptersAdresses() 或任何其他 IP Helper API 获取网络掩码的代码示例吗?
问问题
949 次
1 回答
1
对于 IPv4,您可以使用 AF_INET 套接字和 SIO_GET_INTERFACE_LIST 标志调用 WSAIoctl。这将返回一个包含一组 IP、网络掩码和广播地址的 INTERFACE_INFO 结构数组。请参阅下面的示例代码。
对于 IPv6,“网络掩码”的概念与在 IPv4 中的应用方式不同。 有关详细信息,请参见此处。您是否注意到当您从命令行键入“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;
}
于 2013-01-03T09:29:39.840 回答