Обновление маршрута на месте с помощью RtmUpdateAndUnlockRoute
В следующей процедуре описаны шаги, используемые для обновления маршрута на месте. В следующем примере кода показано, как реализовать процедуру.
Чтобы обновить маршрут на месте, клиент должен выполнить следующие действия.
Заблокируйте маршрут, вызвав RtmLockRoute. В настоящее время эта функция фактически блокирует назначение маршрута. Диспетчер таблиц маршрутизации возвращает указатель на маршрут.
Используйте указатель на структуру RTM_ROUTE_INFO диспетчера таблиц маршрутизации, полученную на шаге 1, чтобы внести необходимые изменения в маршрут. При обновлении на месте можно изменить только определенные элементы структуры RTM_ROUTE_INFO . К ним относятся: Сосед, PrefInfo, EntitySpecificInfo, BelongsToViews и NextHopsList.
Примечание
Если клиент добавляет сведения в члены Соседа или 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);
}