接收更改通知

许多客户端可以同时更新路由表,当路由信息发生更改时,必须通知客户端。 例如,未收到其他客户端对路由表更改的通知的客户端可能会播发过时的路由信息。 可通过对客户端进行编程来向路由表管理器注册,以便收到路由表中的更改的通知,从而防止出现这种情况。 路由表管理器将更改通知发送到注册以接收更改的所有客户端。

更改通知仅适用于目标。 无法查询路由表管理器对特定路由的更改。

对目标路由之一进行更改时,路由表管理器会发出通知,指出发生了更改。 此通知仅发送到已向路由表管理器注册的已发生更改类型的客户端。 在路由表管理器中对路由信息所做的所有更改都发生在一个或多个视图中,并且可以在受支持的视图的任何子集中请求更改通知消息。

目前有三种类型的更改通知可供客户端注册:

  • 对目标路由进行任何更改的通知。 此请求是使用 RTM_CHANGE_TYPE_ALL 标志发出的。

  • 如果到达目标的最佳路由发生更改,或当前最佳路由的下列任一信息发生更改,则发出通知:

    • 首选项
    • 下一跃点
    • 路由标志

    此请求是使用 RTM_CHANGE_TYPE_BEST 标志发出的。

  • 通知类型RTM_CHANGE_TYPE_BEST的所有更改,但最佳路由中非转发标志的更改除外。 例如,路由器管理器在单播视图中等待此类型的更改,并更新单播转发器中的信息。 此请求是使用 RTM_CHANGE_TYPE_FORWARDING 标志发出的。

更改通知请求也可以限制为目标子集,只需将更改通知注册到“已标记”目标。 客户端可以通过调用 RtmMarkDestForChangeNotification 来标记更改通知的目标。

发生更改时,路由表管理器会检查是否有任何客户端必须收到此更改的通知。 如果满足以下所有条件,则必须向客户端通知更改:

  • 发生的更改类型是客户端已注册通知的类型
  • 如果客户端已请求更改所有目标,则对客户端标记的目标或任何目标的更改已发生
  • 客户端请求了发生此更改的视图的更改通知

如果更改满足上述所有条件,则会缓存更改并通知客户端。

通知不指定实际更改的内容,仅指定它们已发生。 客户端必须使用从先前调用 RtmRegisterForChangeNotification 获得的通知句柄调用 RtmGetChangedDests 来检索更改。