Freigeben über


Verwenden einer Client-Specific Routenliste

Die folgenden Verfahren beschreiben die Schritte zur Verwendung der clientspezifischen Routenlisten. Der folgende Beispielcode zeigt, wie die Prozedur implementiert wird.

Um dieses Feature zu verwenden, muss ein Client die folgenden Schritte ausführen:

  1. Rufen Sie RtmCreateRouteList auf, um ein Handle vom Routingtabellen-Manager abzurufen.
  2. Rufen Sie RtmInsertInRouteList auf, wenn der Client dieser Liste eine Route hinzufügen muss.
  3. Wenn der Client die Liste nicht mehr benötigt, sollte er RtmDeleteRouteList aufrufen, um die Liste zu entfernen.

Wenn der Client die Routen in der Liste auflisten muss, sollte der Client die folgenden Schritte ausführen.

  1. Rufen Sie RtmCreateRouteListEnum auf, um ein Enumerationshandle vom Routingtabellen-Manager abzurufen.
  2. Rufen Sie RtmGetListEnumRoutes auf, um die Handles für die Routen in der Liste abzurufen.
  3. Rufen Sie RtmReleaseRoutes auf, um die Handles freizugeben, wenn sie nicht mehr benötigt werden.

Der folgende Beispielcode zeigt, wie Sie eine clientspezifische Routenliste erstellen und verwenden.

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);