接收更改通知

许多客户端可以同时更新路由表,当更改路由信息时,必须通知客户端。 例如,未收到其他客户端对路由表更改的通知的客户端可能会播发过时的路由信息。 这可以通过编程客户端向路由表管理器注册,以通知路由表中的更改。 路由表管理器向注册的所有客户端发送更改通知以接收这些更改。

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

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

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

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

  • 如果到目标的最佳路由发生更改,或者有关当前最佳路由更改的任何以下信息,则通知:

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

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

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

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

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

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

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

通知不指定实际更改的内容,仅指定实际更改发生的情况。 客户端必须使用从先前调用 RtmRegisterForChangeNotification 获取的通知句柄调用 RtmGetChangedDest 来检索更改。