다음을 통해 공유


모든 경로 열거

다음 절차에서는 RTMv2 API에서 사용하는 엔터티를 열거하는 데 사용되는 단계를 간략하게 설명합니다. 다음 샘플 코드는 모든 경로를 열거하는 방법을 보여 줍니다.

각 열거형에 대한 기본 프로세스는 다음과 같습니다.

  1. 라우팅 테이블 관리자에서 핸들을 가져와 열거형을 시작합니다. RtmCreateDestEnum, RtmCreateRouteEnumRtmCreateNextHopEnum을 호출하여 열거되는 정보의 종류를 지정하는 조건을 제공합니다. 이 조건에는 대상 범위, 특정 인터페이스 및 정보가 상주하는 뷰가 포함되지만 이에 국한되지는 않습니다.
  2. RtmGetEnumDests, RtmGetEnumRoutesRtmGetEnumNextHops를 한 번 이상 호출하여 라우팅 테이블 관리자가 ERROR_NO_MORE_ITEMS 반환할 때까지 데이터를 검색합니다. 경로, 대상 및 다음 홉 데이터는 주소 정보(경로가 열거되는 경우 기본 설정 및 메트릭 값)의 순서로 반환됩니다.
  3. 열거형과 연결된 핸들 또는 정보 구조가 더 이상 필요하지 않으면 RtmReleaseDests, RtmReleaseRoutesRtmReleaseNextHops 를 호출합니다.
  4. RtmDeleteEnumHandle을 호출하여 열거형을 만들 때 반환된 열거형 핸들을 해제합니다. 이 함수는 모든 형식의 열거형에 대한 핸들을 해제하는 데 사용됩니다.

참고

보류 상태에 있는 경로는 클라이언트가 RTM_VIEW_MASK_ANY 사용하여 모든 뷰에서 데이터를 요청할 때만 열거됩니다.

 

다음 샘플 코드는 라우팅 테이블의 모든 경로를 열거하는 방법을 보여줍니다.

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