用于检索网络掩码信息的 IPHelper API 是什么?

What is the IPHelper api to retrieve netmask information?

提问人:Dyno Fu 提问时间:1/2/2013 更新时间:1/3/2013 访问量:998

问:

我的第一个赌注是因为有示例代码,但它只支持 IPv4。然后我尝试了,但文档表明它已被 .我应该使用 GetAdaptersAdresses() 或任何其他 IP Helper API 获取网络掩码的任何代码示例?GetIpAddrTable()GetAdaptersInfo()GetAdaptersAddresses()

Windows IPHelper

评论


答:

1赞 selbie 1/3/2013 #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;
}

评论

0赞 selbie 1/3/2013
更多细节在这里:stackoverflow.com/questions/3679652/...
0赞 Dyno Fu 1/4/2013
谢谢你的回答。网络掩码或前缀对我来说都可以。我目前的实现是遍历 FirstPrefix 并找到匹配的,即每个IP_ADAPTER_ADDRESSES的“主机 IP 地址前缀”并使用其 PrefixLen。msdn.microsoft.com/en-us/library/windows/desktop/....
0赞 selbie 1/4/2013
这听起来很合理。昨晚扫描文档时,我没有看到 FirstPrefix。