notifyStableUnicastIpAddressTable 函数 (netioapi.h)
NotifyStableUnicastIpAddressTable 函数检索本地计算机上的稳定单播 IP 地址表。
语法
IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API NotifyStableUnicastIpAddressTable(
[in] ADDRESS_FAMILY Family,
[in, out] PMIB_UNICASTIPADDRESS_TABLE *Table,
[in] PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK CallerCallback,
[in] PVOID CallerContext,
[in, out] HANDLE *NotificationHandle
);
参数
[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。
[in, out] Table
指向 MIB_UNICASTIPADDRESS_TABLE 结构的指针。 如果 NotifyStableUnicastIpAddressTable 成功,此参数将返回本地计算机上的稳定单播 IP 地址表。
当 NotifyStableUnicastIpAddressTable 返回 ERROR_IO_PENDING 指示 I/O 请求挂起时,稳定的单播 IP 地址表将返回到 CallerCallback 参数中的函数。
[in] CallerCallback
指向要通过稳定的单播 IP 地址表调用的函数的指针。 如果 NotifyStableUnicastIpAddressTable 返回 ERROR_IO_PENDING,指示 I/O 请求处于挂起状态,则将调用此函数。
[in] CallerContext
当稳定的单播 IP 地址表 si 可用时,传递给 CallerCallback 参数中指定的回调函数的用户上下文。
[in, out] NotificationHandle
用于返回句柄的指针,该句柄可用于取消请求以检索稳定的单播 IP 地址表。 如果 来自 NotifyStableUnicastIpAddressTable 的返回值 ERROR_IO_PENDING 指示 I/O 请求处于挂起状态,则返回此参数。
返回值
如果函数立即成功,则返回值NO_ERROR,并在 Table 参数中返回稳定的单播 IP 表。
如果 I/O 请求处于挂起状态,则函数返回 ERROR_IO_PENDING 并且当 I/O 请求使用稳定的单播 IP 地址表完成时,将调用 CallerCallback 参数指向的函数。
如果函数失败,则返回值为以下错误代码之一。
返回代码 | 说明 |
---|---|
|
遇到无效句柄时发生内部错误。 |
|
向该函数传递了无效参数。 如果 Table 参数为 NULL 指针, NotificationHandle 参数为 NULL 指针,或者 Family 参数不是 AF_INET、 AF_INET6或 AF_UNSPEC,则返回此错误。 |
|
内存不足。 |
|
使用 FormatMessage 获取返回错误的消息字符串。 |
注解
NotifyStableUnicastIpAddressTable 函数在 Windows Vista 及更高版本上定义。
如果 NotifyStableUnicastIpAddressTable 函数立即成功,则返回值NO_ERROR并且稳定的单播 IP 表在 Table 参数中返回。 当不再需要MIB_UNICASTIPADDRESS_TABLE信息时,调用应用程序应使用 FreeMibTable 函数释放 Table 参数指向的内存。
所有单播 IP 地址(按需拨号地址除外)仅当它们处于首选状态时才会被视为稳定。 对于普通单播 IP 地址条目,这将对应于设置为 IpDadStatePreferred 的 IP 地址MIB_UNICASTIPADDRESS_ROW的 DadState 成员。 每个按需拨号地址定义其自己的稳定性指标。 目前,此函数考虑的唯一按需拨号地址是本地计算机上的 Teredo 客户端使用的单播 IP 地址。
Family 参数必须设置为 AF_INET、AF_INET6 或 AF_UNSPEC。
如果 NotifyStableUnicastIpAddressTable 成功并返回NO_ERROR, 则 Table 参数返回本地计算机上的稳定单播 IP 地址表。
当 NotifyStableUnicastIpAddressTable 返回 ERROR_IO_PENDING 指示 I/O 请求挂起时,稳定的单播 IP 地址表将返回到 CallerCallback 参数中的函数。
NotifyStableUnicastIpAddressTable 函数主要由使用 Teredo 客户端的应用程序使用。
如果 Teredo 使用的单播 IP 地址在本地计算机上可用,但不在本地计算机上处于稳定 (限定) 状态, 则 NotifyStableUnicastIpAddressTable 将返回ERROR_IO_PENDING,并且最终将通过调用 CallerCallback 参数中的 函数返回稳定的单播 IP 地址表。 如果 Teredo 地址不可用或处于稳定状态,而其他单播 IP 地址处于稳定状态,则永远不会调用 CallerCallback 参数中的函数。
CallerCallback 参数中指定的回调函数应定义为 VOID 类型的函数。 传递给回调函数的参数包括:
参数 | 说明 |
---|---|
IN PVOID CallerContext | 注册通知时传递给 NotifyStableUnicastIpAddressTable 函数的 CallerContext 参数。 |
IN PMIB_UNICASTIPADDRESS_TABLE AddressTable | 指向包含本地计算机上稳定单播 IP 地址表的 MIB_UNICASTIPADDRESS_TABLE 的指针。 |
CallerCallback 参数中指定的回调函数必须在调用 NotifyStableUnicastIpAddressTable 函数的应用程序所在的同一进程中实现。 如果回调函数位于单独的 DLL 中,则应先加载 DLL,然后再调用 NotifyStableUnicastIpAddressTable 函数来注册更改通知。
回调指示中使用的 AddressTable 参数指向的内存由操作系统分配。 当不再需要MIB_UNICASTIPADDRESS_TABLE信息时,接收通知的应用程序应使用 FreeMibTable 函数释放 AddressTable 参数指向的内存。
调用 NotifyStableUnicastIpAddressTable 函数注册更改通知后,将继续发送这些通知,直到应用程序取消注册更改通知或应用程序终止为止。 如果应用程序终止,系统将自动取消注册更改通知的任何注册。 仍建议应用程序在终止之前显式取消注册任何更改通知。
如果系统关闭或重新启动,则更改通知的任何注册都不会保留。
若要取消注册更改通知,请调用 CancelMibChangeNotify2 函数,传递由 NotifyStableUnicastIpAddressTable 返回的 NotificationHandle 参数。
应用程序无法从当前正在为同一 NotificationHandle 参数执行通知回调函数的线程上下文调用 CancelMibChangeNotify2 函数。 否则,执行该回调的线程将导致死锁。 因此,不能在通知回调例程中直接调用 CancelMibChangeNotify2 函数。 在更一般的情况下,执行 CancelMibChangeNotify2 函数的线程不能拥有执行通知回调操作的线程将等待的资源,因为这会导致类似的死锁。 CancelMibChangeNotify2 函数应从另一个线程调用,接收通知回调的线程不依赖于该线程。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | netioapi.h (包括 Iphlpapi.h) |
Library | Iphlpapi.lib |
DLL | Iphlpapi.dll |