Windows 检索网络掩码信息的IPHelper api是什么?

Windows 检索网络掩码信息的IPHelper api是什么?,windows,iphelper,Windows,Iphelper,我的第一个赌注是GetIpAddrTable(),因为有示例代码,但它只支持IPv4。然后我尝试了getAdapterInfo(),但文档表明它已被getAdapterAddresses()淘汰。我应该使用GetAdapterAddresses()或任何其他IP Helper API获取网络掩码的任何代码示例吗 对于IPv4,您可以使用AF_INET socket和SIO_GET_INTERFACE_LIST标志调用WSAIoctl。这将返回包含一组IP、网络掩码和广播地址的接口信息结构数组。请

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

对于IPv4,您可以使用AF_INET socket和SIO_GET_INTERFACE_LIST标志调用WSAIoctl。这将返回包含一组IP、网络掩码和广播地址的接口信息结构数组。请参见下面的示例代码

对于IPv6,“网络掩码”的概念与IPv4中的应用方式不同。您是否注意到,当您从命令行键入“ipconfig”或尝试从控制面板手动设置IPv6地址时,没有显示“netmask”字段

因此,您可以使用SIO_GET_INTERFACE_LIST或GetIPAddressTable作为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;
}
int-tmain(int-argc,_-TCHAR*argv[]
{
WSAData数据={};
sockaddr_in addrLocal={};
接口信息列表[100]={};
DWORD DWBYTES返回值=0;
DWORD dwNumInterfaces=0;
::WSAStartup(MAKEWORD(2,2)和数据);
int s=插座(AF INET,SOCK DGRAM,0);
int result=WSAIoctl(s,SIO_GET_INTERFACE_LIST,NULL,0,(void*)信息列表,sizeof(infolist),&dwbytesrurned,NULL,NULL);
dwNumInterfaces=dwBytesReturned/sizeof(接口信息);
对于(DWORD索引=0;索引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));
}
其他的
{
继续;
}
printf(“IP:%s网络掩码:%s广播:%s\n”,szIP,szNetMask,szBroadcast);
}
返回0;
}

此处有更多详细信息:谢谢您的回答。网络掩码或前缀对我来说都可以。我当前的实现是迭代FirstPrefix,并找到每个IP_适配器_地址的匹配项,即“主机IP地址前缀”,并使用其前缀Xlen。听起来很合理。我昨晚扫描文件时没有看到FirstPrefix。