notifyRouteChange 函数 (iphlpapi.h)
只要 IPv4 路由表中发生更改, NotifyRouteChange 函数就会向调用方发送通知。
语法
IPHLPAPI_DLL_LINKAGE DWORD NotifyRouteChange(
[out] PHANDLE Handle,
[in] LPOVERLAPPED overlapped
);
parameters
[out] Handle
指向 HANDLE 变量的指针,该变量接收要用于异步通知的句柄。
[in] overlapped
指向 OVERLAPPED 结构的指针,该结构通知调用方路由表中的任何更改。
返回值
如果函数成功,则如果调用方为 Handle 和重叠参数指定 NULL,则返回值NO_ERROR。 如果调用方指定非 NULL 参数,则成功返回值ERROR_IO_PENDING。 如果函数失败,请使用 FormatMessage 获取返回错误的消息字符串。
返回代码 | 说明 |
---|---|
|
正在取消注册上下文,因此调用已立即取消。 |
|
传递的参数无效。 如果 Handle 和 重叠 参数都不是 NULL,但调用进程无法写入输入参数指定的内存,则返回此错误。 如果客户端已发出更改通知请求,则也会返回此错误,因此此重复请求将失败。 |
|
可用内存不足,无法完成该操作。 |
|
此错误在不支持此函数的 Windows 版本(如 Windows 98/95 和 Windows NT 4.0)上返回。 |
注解
The
可以通过两种方式调用 NotifyRouteChange 函数:
- 同步方法
- 异步方法
如果调用方为 Handle 和重叠参数指定 NULL,则对 NotifyRouteChange 的调用是同步的,并且将阻塞,直到发生 IPv4 路由表更改。 在这种情况下,如果发生更改, 则 NotifyRouteChange 函数完成以指示已发生更改。
如果以同步方式调用 NotifyRouteChange 函数,则会在下次 IPv4 路由更改时发送通知,直到应用程序终止。
如果调用方指定句柄变量和 OVERLAPPED 结构,则调用方可以使用返回的句柄和 OVERLAPPED 结构来接收有关 IPv4 路由表更改的异步通知。 有关使用句柄和 OVERLAPPED 结构接收通知的信息,请参阅以下主题:
如果应用程序收到通知并要求通知进行下一次更改,则必须再次调用 NotifyRouteChange 函数。CancelIPChangeNotify 函数通过成功调用 NotifyAddrChange 或 NotifyRouteChange 函数,取消之前请求的 IP 地址和路由更改的通知。
通知应用程序更改后,应用程序可以调用 GetIpForwardTable 或 GetIpForwardTable2 函数来检索 IPv4 路由表以确定更改的内容。 如果应用程序收到通知,并且需要通知进行下一次更改,则必须再次调用 NotifyRouteChange 函数。
如果 异步调用 NotifyRouteChange 函数,则会在下一次 IPv4 路由更改时发送通知,直到应用程序通过调用 CancelIPChangeNotify 函数取消通知或应用程序终止。 如果应用程序终止,系统将自动取消通知的注册。 仍建议应用程序在终止之前显式取消任何通知。
通知的任何注册不会在系统关闭或重新启动时保留。
在 Windows Vista 及更高版本上,可以使用 NotifyRouteChange2 函数注册,以便收到本地计算机上 IPv6 路由表更改的通知。
示例
以下示例等待 IP 路由表中发生更改。
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
void main()
{
OVERLAPPED overlap;
DWORD ret;
HANDLE hand = NULL;
overlap.hEvent = WSACreateEvent();
ret = NotifyRouteChange(&hand, &overlap);
if (ret != NO_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
printf("NotifyRouteChange error...%d\n", WSAGetLastError());
return;
}
}
if ( WaitForSingleObject(overlap.hEvent, INFINITE) == WAIT_OBJECT_0 )
printf("Routing table changed..\n");
}
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | iphlpapi.h |
Library | Iphlpapi.lib |
DLL | Iphlpapi.dll |