getUnicastIpAddressTable 函数 (netioapi.h)
GetUnicastIpAddressTable 函数检索本地计算机上的单播 IP 地址表。
语法
IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetUnicastIpAddressTable(
[in] ADDRESS_FAMILY Family,
[out] PMIB_UNICASTIPADDRESS_TABLE *Table
);
parameters
[in] Family
要检索的地址系列。
Winsock2.h 头文件中列出了地址系列的可能值。 请注意,AF_地址系列和PF_协议系列常量的值 (相同,例如 ,AF_INET 和 PF_INET) ,因此可以使用任一常量。
在针对 Windows Vista 及更高版本发布的 Windows SDK 上,头文件的组织方式已更改,并且 Ws2def.h 头文件中定义了此成员的可能值。 请注意, Ws2def.h 头文件会自动包含在 Winsock2.h 中,永远不应直接使用。
当前支持的值是 AF_INET、 AF_INET6 和 AF_UNSPEC。
[out] Table
指向 MIB_UNICASTIPADDRESS_TABLE 结构的指针,该结构包含本地计算机上的单播 IP 地址条目表。
返回值
如果函数成功,则返回值NO_ERROR。
如果函数失败,则返回值为以下错误代码之一。
返回代码 | 说明 |
---|---|
|
向该函数传递了无效参数。 如果在 Table 参数中传递 NULL 指针,或者 Family 参数未指定为AF_INET、AF_INET6或AF_UNSPEC,则返回此错误。 |
|
内存资源不足,无法完成操作。 |
|
找不到元素。 如果未找到 Family 参数中指定的单播 IP 地址条目,则返回此错误。 |
|
不支持该请求。 如果本地计算机上没有 IPv4 堆栈,并且已在 Family 参数中指定了AF_INET,则返回此错误。 如果本地计算机上没有 IPv6 堆栈,并且已在 Family 参数中指定了AF_INET6,则也会返回此错误。 在不支持此函数的 Windows 版本上也会返回此错误。 |
|
使用 FormatMessage 获取返回错误的消息字符串。 |
注解
GetUnicastIpAddressTable 函数是在 Windows Vista 及更高版本上定义的。
The
GetUnicastIpAddressTable 函数枚举本地系统上的单播 IP 地址,并在 MIB_UNICASTIPADDRESS_TABLE 结构中返回此信息。
单播 IP 地址条目在 Table 参数指向的缓冲区中的MIB_UNICASTIPADDRESS_TABLE结构中返回。 MIB_UNICASTIPADDRESS_TABLE 结构包含单播 IP 地址条目计数和每个单播 IP 地址条目的MIB_UNICASTIPADDRESS_ROW结构数组。 当不再需要这些返回的结构时,通过调用 FreeMibTable 释放内存。
Family 参数必须初始化为 AF_INET、AF_INET6 或 AF_UNSPEC。
请注意,Table 参数指向的返回MIB_UNICASTIPADDRESS_TABLE结构可能包含 NumEntries 成员与 MIB_UNICASTIPADDRESS_TABLE 结构的Table 成员中的第一个MIB_UNICASTIPADDRESS_ROW数组条目之间的对齐填充。 MIB_UNICASTIPADDRESS_ROW数组条目之间也可能存在对齐的填充。 对 MIB_UNICASTIPADDRESS_ROW 数组条目的任何访问都应假定可能存在填充。
示例
以下示例检索单播 IP 地址表,并打印每个检索 到MIB_UNICASTIPADDRESS_ROW 结构中的一些值。
#ifndef UNICODE
#define UNICODE
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <Windows.h.>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
// Need to link with Iphlpapi.lib and Ws2_32.lib
#pragma comment (lib, "iphlpapi.lib")
#pragma comment (lib, "Ws2_32.lib")
int __cdecl wmain()
{
// Declare and initialize variables
unsigned int i;
DWORD Result = 0;
WCHAR Ipv4String[16] = { 0 };
WCHAR Ipv6String[46] = { 0 };
PMIB_UNICASTIPADDRESS_TABLE pipTable = NULL;
Result = GetUnicastIpAddressTable(AF_UNSPEC, &pipTable);
if (Result != NO_ERROR) {
wprintf(L"GetUnicastIpAddressTable returned error: %ld\n", Result);
exit(1);
}
// Print some variables from the rows in the table
wprintf(L"Number of table entries: %d\n\n", pipTable->NumEntries);
for (i = 0; i < pipTable->NumEntries; i++) {
wprintf(L"AddressFamily[%d]:\t\t ", i);
switch (pipTable->Table[i].Address.si_family) {
case AF_INET:
wprintf(L"IPv4\n");
if (InetNtopW
(AF_INET, &pipTable->Table[i].Address.Ipv4.sin_addr, Ipv4String,
16) != NULL)
wprintf(L"IPv4 Address:\t\t\t %ws\n", Ipv4String);
break;
case AF_INET6:
wprintf(L"IPv6\n");
if (InetNtopW
(AF_INET6, &pipTable->Table[i].Address.Ipv6.sin6_addr,
Ipv6String, 46) != NULL)
wprintf(L"IPv6 Address:\t\t\t %ws\n", Ipv6String);
break;
default:
wprintf(L"Other: %d\n", pipTable->Table[i].Address.si_family);
break;
}
wprintf(L"Interface LUID NetLuidIndex[%d]: %lu\n",
i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);
wprintf(L"Interface LUID IfType[%d]:\t ", i);
switch (pipTable->Table[i].InterfaceLuid.Info.IfType) {
case IF_TYPE_OTHER:
wprintf(L"Other\n");
break;
case IF_TYPE_ETHERNET_CSMACD:
wprintf(L"Ethernet\n");
break;
case IF_TYPE_ISO88025_TOKENRING:
wprintf(L"Token ring\n");
break;
case IF_TYPE_PPP:
wprintf(L"PPP\n");
break;
case IF_TYPE_SOFTWARE_LOOPBACK:
wprintf(L"Software loopback\n");
break;
case IF_TYPE_ATM:
wprintf(L"ATM\n");
break;
case IF_TYPE_IEEE80211:
wprintf(L"802.11 wireless\n");
break;
case IF_TYPE_TUNNEL:
wprintf(L"Tunnel encapsulation\n");
break;
case IF_TYPE_IEEE1394:
wprintf(L"IEEE 1394 (Firewire)\n");
break;
default:
wprintf(L"Unknown: %d\n",
pipTable->Table[i].InterfaceLuid.Info.IfType);
break;
}
wprintf(L"Interface Index[%d]:\t\t %lu\n",
i, pipTable->Table[i].InterfaceIndex);
wprintf(L"Prefix Origin[%d]:\t\t ", i);
switch (pipTable->Table[i].PrefixOrigin) {
case IpPrefixOriginOther:
wprintf(L"IpPrefixOriginOther\n");
break;
case IpPrefixOriginManual:
wprintf(L"IpPrefixOriginManual\n");
break;
case IpPrefixOriginWellKnown:
wprintf(L"IpPrefixOriginWellKnown\n");
break;
case IpPrefixOriginDhcp:
wprintf(L"IpPrefixOriginDhcp\n");
break;
case IpPrefixOriginRouterAdvertisement:
wprintf(L"IpPrefixOriginRouterAdvertisement\n");
break;
case IpPrefixOriginUnchanged:
wprintf(L"IpPrefixOriginUnchanged\n");
break;
default:
wprintf(L"Unknown: %d\n", pipTable->Table[i].PrefixOrigin);
break;
}
wprintf(L"Suffix Origin[%d]:\t\t ", i);
switch (pipTable->Table[i].SuffixOrigin) {
case IpSuffixOriginOther:
wprintf(L"IpSuffixOriginOther\n");
break;
case IpSuffixOriginManual:
wprintf(L"IpSuffixOriginManual\n");
break;
case IpSuffixOriginWellKnown:
wprintf(L"IpSuffixOriginWellKnown\n");
break;
case IpSuffixOriginDhcp:
wprintf(L"IpSuffixOriginDhcp\n");
break;
case IpSuffixOriginLinkLayerAddress:
wprintf(L"IpSuffixOriginLinkLayerAddress\n");
break;
case IpSuffixOriginRandom:
wprintf(L"IpSuffixOriginRandom\n");
break;
case IpSuffixOriginUnchanged:
wprintf(L"IpSuffixOriginUnchanged\n");
break;
default:
wprintf(L"Unknown: %d\n", pipTable->Table[i].SuffixOrigin);
break;
}
wprintf(L"Valid Lifetime[%d]:\t\t 0x%x (%u)\n", i,
pipTable->Table[i].ValidLifetime,
pipTable->Table[i].ValidLifetime);
wprintf(L"Preferred Lifetime[%d]:\t\t 0x%x (%u)\n", i,
pipTable->Table[i].PreferredLifetime,
pipTable->Table[i].PreferredLifetime);
wprintf(L"OnLink PrefixLength[%d]:\t\t %lu\n", i,
pipTable->Table[i].OnLinkPrefixLength);
wprintf(L"Skip As Source[%d]:\t\t ", i);
if (pipTable->Table[i].SkipAsSource)
wprintf(L"Yes\n");
else
wprintf(L"No\n");
wprintf(L"Dad State[%d]:\t\t\t ", i);
switch (pipTable->Table[i].DadState) {
case IpDadStateInvalid:
wprintf(L"IpDadStateInvalid\n");
break;
case IpDadStateTentative:
wprintf(L"IpDadStateTentative\n");
break;
case IpDadStateDuplicate:
wprintf(L"IpDadStateDuplicate\n");
break;
case IpDadStateDeprecated:
wprintf(L"IpDadStateDeprecated\n");
break;
case IpDadStatePreferred:
wprintf(L"IpDadStatePreferred\n");
break;
default:
wprintf(L"Unknown: %d\n", pipTable->Table[i].DadState);
break;
}
wprintf(L"\n");
}
if (pipTable != NULL) {
FreeMibTable(pipTable);
pipTable = NULL;
}
exit(0);
}
要求
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | netioapi.h (包括 Iphlpapi.h) |
Library | Iphlpapi.lib |
DLL | Iphlpapi.dll |
请参阅
FreeMibTable
InitializeUnicastIpAddressEntry