使用 RtmUpdateAndUnlockRoute 就地更新路由
下列程式概述用來就地更新路由的步驟。 下列範例程式代碼示範如何實作程式。
若要就地更新路由,客戶端應採取下列步驟
呼叫 RtmLockRoute來鎖定路由。 目前,此函式實際上會鎖定路由的目的地。 路由表管理員返回該路由的指標。
在步驟 1 中取得路由表管理員 RTM_ROUTE_INFO 結構的指標,使用它對路由進行必要的變更。 在進行就地更新時,只能修改 RTM_ROUTE_INFO 結構中的某些成員。 這些成員包括:Neighbour、PrefInfo、EntitySpecificInfo、BelongsToViews和 NextHopsList。
注意
如果客戶端將資訊新增至 Neighbour 或 NextHopsList 成員,用戶端必須呼叫 RtmReferenceHandles,以明確遞增路由表管理員保留在下一個躍點物件上的參考計數。 同樣地,如果用戶端從 NextHopsList 成員移除資訊,客戶端必須呼叫 RtmReleaseNextHops 以遞減參考計數。
呼叫 RtmUpdateAndUnlockRoute,以通知路由表管理員已發生變更。 路由表管理員會認可變更、更新目的地以反映新資訊,然後解除鎖定路由。
下列範例程式代碼示範如何使用路由表中實際路由資訊的指標,直接更新路由。
Status = RtmLockRoute(RtmRegHandle,
RouteHandle,
TRUE,
TRUE,
&RoutePointer);
if (Status == NO_ERROR)
{
// Update route parameters in place (i.e., directly on
// the routing table manager's copy)
// Update the metric and views of the route
RoutePointer->PrefInfo.Metric = 16;
// Change the views so that the route belongs to only the multicast view
RoutePointer->BelongsToViews = RTM_VIEW_MASK_MCAST;
// Set the entity-specific information to X
RoutePointer->EntitySpecificInfo = X;
// Note that the following manipulation of
// next-hop references is not needed when
// using RtmAddRouteToDest, as it is done
// by the routing table manager automatically
// Change next hop from NextHop1 to NextHop2
NextHop1 = RoutePointer->NextHopsList.NextHop[0];
// Explicitly dereference the old next hop
RtmReleaseNextHops(RtmRegHandle, 1, &NextHop1);
RoutePointer->NextHopsList.NextHop[0] = NextHop2;
// Explicitly reference next hop being added
RtmReferenceHandles(RtmRegHandle, 1, &NextHop2);
// Call the routing table manager to indicate that route information
// has changed, and that its position might
// have to be rearranged and the corresponding destination
// needs to be updated to reflect this change.
Status = RtmUpdateAndUnlockRoute(RtmRegHandle,
RouteHandle,
INFINITE, // Keep forever
NULL,
0,
NULL,
&ChangeFlags);
ASSERT(Status == NO_ERROR);
}