모든 경로 열거
다음 절차에서는 RTMv2 API에서 사용하는 엔터티를 열거하는 데 사용되는 단계를 간략하게 설명합니다. 다음 샘플 코드는 모든 경로를 열거하는 방법을 보여 줍니다.
각 열거형에 대한 기본 프로세스는 다음과 같습니다.
- 라우팅 테이블 관리자에서 핸들을 가져와 열거형을 시작합니다. RtmCreateDestEnum, RtmCreateRouteEnum 및 RtmCreateNextHopEnum을 호출하여 열거되는 정보의 종류를 지정하는 조건을 제공합니다. 이 조건에는 대상 범위, 특정 인터페이스 및 정보가 상주하는 뷰가 포함되지만 이에 국한되지는 않습니다.
- RtmGetEnumDests, RtmGetEnumRoutes 및 RtmGetEnumNextHops를 한 번 이상 호출하여 라우팅 테이블 관리자가 ERROR_NO_MORE_ITEMS 반환할 때까지 데이터를 검색합니다. 경로, 대상 및 다음 홉 데이터는 주소 정보(경로가 열거되는 경우 기본 설정 및 메트릭 값)의 순서로 반환됩니다.
- 열거형과 연결된 핸들 또는 정보 구조가 더 이상 필요하지 않으면 RtmReleaseDests, RtmReleaseRoutes 및 RtmReleaseNextHops 를 호출합니다.
- 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);
}