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 获取返回错误的消息字符串。

返回代码 说明
ERROR_CANCELLED
正在取消注册上下文,因此调用已立即取消。
ERROR_INVALID_PARAMETER
传递的参数无效。 如果 Handle重叠 参数都不是 NULL,但调用进程无法写入输入参数指定的内存,则返回此错误。 如果客户端已发出更改通知请求,则也会返回此错误,因此此重复请求将失败。
ERROR_NOT_ENOUGH_MEMORY
可用内存不足,无法完成该操作。
ERROR_NOT_SUPPORTED
此错误在不支持此函数的 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 地址和路由更改通知。

通知应用程序更改后,应用程序可以调用 GetIpForwardTableGetIpForwardTable2 函数来检索 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

另请参阅

CancelIPChangeNotify

GetIpForwardTable

GetIpForwardTable2

GetOverlappedResult

IP 帮助程序函数参考

NotifyAddrChange

OVERLAPPED