Поделиться через


Использование списка маршрутов Client-Specific

В следующих процедурах описаны шаги по использованию списков маршрутов для конкретного клиента. В следующем примере кода показано, как реализовать процедуру.

Чтобы использовать эту функцию, клиент должен выполнить следующие действия.

  1. Вызовите rtmCreateRouteList , чтобы получить дескриптор из диспетчера таблиц маршрутизации.
  2. Вызывайте RtmInsertInRouteList всякий раз, когда клиент должен добавить маршрут в этот список.
  3. Если клиенту больше не требуется список, он должен вызвать RtmDeleteRouteList , чтобы удалить список.

Если клиент должен перечислить маршруты в списке, он должен выполнить следующие действия.

  1. Вызовите rtmCreateRouteListEnum , чтобы получить дескриптор перечисления из диспетчера таблиц маршрутизации.
  2. Вызовите RtmGetListEnumRoutes , чтобы получить дескрипторы маршрутов в списке.
  3. Вызовите RtmReleaseRoutes , чтобы освободить дескрипторы, когда они больше не требуются.

В следующем примере кода показано, как создать и использовать список маршрутов для конкретного клиента.

HANDLE RouteListHandle1;
HANDLE RouteListHandle2;

// Create two entity-specific lists to add routes to

Status = RtmCreateRouteList(RtmRegHandle,
                            &RouteListHandle1);
// Check Status
//...

Status = RtmCreateRouteList(RtmRegHandle,
                            &RouteListHandle2);
// Check Status
//...

// Assume you have added a bunch of routes
// by calling RtmAddRouteToDest many times
// with 'RouteListHandle1' specified similar to
// Status = RtmAddRouteToDest(RtmRegHandle,
//                            ...
//                            RouteListHandle1,
//                            ...
//                            &ChangeFlags);

// Enumerate routes in RouteListHandle1 list

// Create an enumeration on the route list

Status = RtmCreateRouteListEnum(RtmRegHandle,
                                RouteListHandle1,
                                &EnumHandle);

if (Status == NO_ERROR)
{
        // Allocate space on the top of the stack
        
    MaxHandles = RegnProfile.MaxHandlesInEnum;

    RouteHandles = _alloca(MaxHandles * sizeof(HANDLE));

    // Note how the termination condition is different
    // from other enumerations - the call to the function
    // RtmGetListEnumRoutes always returns NO_ERROR
    // Quit when you get fewer handles than requested
    
    do
    {
                // Get next set of routes from the list enumeration
        
        NumHandles = MaxHandles;

        Status = RtmGetListEnumRoutes(RtmRegHandle,
                                      EnumHandle,
                                      &NumHandles,
                                      RouteHandles);

        for (i = 0; i < NumHandles; i++)
        {
            Print("Route Handle %5lu: %p\n", i, RouteHandles[i]);
        }

        // Move all these routes to another route list
        // They are automatically removed from the old one
        
        Status = RtmInsertInRouteList(RtmRegHandle,
                                      RouteListHandle2,
                                      NumHandles,
                                      RouteHandles);
        // Check Status...
        
                // Release the routes that have been enumerated
        
        RtmReleaseRoutes(RtmRegHandle, NumHandles, RouteHandles);
    }
    while (NumHandles == MaxHandles);

    RtmDeleteEnumHandle(RtmRegHandle, EnumHandle);
}

// Destroy all the entity-specific route lists 
// after removing all routes from these lists;
// the routes themselves are not deleted

Status = RtmDeleteRouteList(RtmRegHandle, RouteListHandle1);
ASSERT(Status == NO_ERROR);


Status = RtmDeleteRouteList(RtmRegHandle, RouteListHandle2);
ASSERT(Status == NO_ERROR);