Dela via


Räkna upp alla vägar

Följande procedur beskriver de steg som används för att räkna upp någon av de entiteter som används av RTMv2-API:et. Exempelkoden som följer visar hur du räknar upp alla vägar.

Den grundläggande processen för varje uppräkning är följande

  1. Starta uppräkningen genom att hämta ett handtag från routningstabellhanteraren. Anropa RtmCreateDestEnum, RtmCreateRouteEnum och RtmCreateNextHopEnum för att ange de kriterier som anger vilken typ av information som räknas upp. Det här villkoret omfattar, men är inte begränsat till ett antal destinationer, ett visst gränssnitt och vyerna där informationen finns.
  2. Anropa RtmGetEnumDests, RtmGetEnumRoutes och RtmGetEnumNextHops en eller flera gånger för att hämta data tills routningstabellhanteraren returnerar ERROR_NO_MORE_ITEMS. Routnings-, mål- och nästahoppsdata returneras i ordning efter adressinformationen (och inställnings- och måttvärdena, om vägar räknas upp).
  3. Anropa RtmReleaseDests, RtmReleaseRoutes och RtmReleaseNextHops när handtagen eller informationsstrukturerna som är associerade med uppräkningen inte längre krävs.
  4. Anropa RtmDeleteEnumHandle för att släppa uppräkningshandtaget som returnerades när uppräkningen skapades. Den här funktionen används för att frigöra handtaget för alla typer av uppräkningar.

Not

Vägar som är i nedrullningsläge räknas bara upp när en klient begär data från alla vyer med hjälp av RTM_VIEW_MASK_ANY.

 

Följande exempelkod visar hur du räknar upp alla vägar i routningstabellen.

MaxHandles = RegnProfile.MaxHandlesInEnum;

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

// Do a "route enumeration" over the whole table
// by passing a NULL DestHandle in this function.

DestHandle = NULL; // Give a valid handle to enumerate over a particular destination

Status = RtmCreateRouteEnum(RtmRegHandle,
                            DestHandle,
                            RTM_VIEW_MASK_UCAST|RTM_VIEW_MASK_MCAST,
                            RTM_ENUM_OWN_ROUTES, // Get only your own routes
                            NULL,
                            0,
                            NULL,
                            0,
                            &EnumHandle2);
if (Status == NO_ERROR)
{
    do
    {
        NumHandles = MaxHandles;

        Status = RtmGetEnumRoutes(RtmRegHandle
                                  EnumHandle2,
                                  &NumHandles,
                                  RouteHandles);

        for (k = 0; k < NumHandles; k++)
        {
            wprintf("Route %d: %p\n", l++, RouteHandles[k]);

            // Get route information using the route's handle
            Status = RtmGetRouteInfo(...RouteHandles[k]...);

            if (Status == NO_ERROR)
            {
                // Do whatever you want with the route info
                //...

                // Release the route information once you are done
                RtmReleaseRouteInfo(...);
            }
        }

        RtmReleaseRoutes(RtmRegHandle, NumHandles, RouteHandles);
    }
    while (Status == NO_ERROR)

    // Close the enumeration and release its resources
    RtmDeleteEnumHandle(RtmRegHandle, EnumHandle2);
}