GetIpForwardTable 함수(iphlpapi.h)
GetIpForwardTable 함수는 IPv4 라우팅 테이블을 검색합니다.
구문
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
매개 변수
[out] pIpForwardTable
IPv4 라우팅 테이블을 MIB_IPFORWARDTABLE 구조로 수신하는 버퍼에 대한 포인터입니다.
[in, out] pdwSize
입력 시 pIpForwardTable 매개 변수가 가리키는 버퍼의 크기(바이트)를 지정합니다.
출력에서 버퍼가 반환된 라우팅 테이블을 보유할 만큼 충분히 크지 않은 경우 함수는 이 매개 변수를 필요한 버퍼 크기(바이트)와 동일하게 설정합니다.
[in] bOrder
반환된 테이블을 정렬할지 여부를 지정하는 부울 값입니다. 이 매개 변수가 TRUE이면 테이블이 다음 순서로 정렬됩니다.
- 대상 주소
- 경로를 생성한 프로토콜
- 다중 경로 라우팅 정책
- 다음 홉 주소
반환 값
함수가 성공하면 반환 값은 NO_ERROR (0)입니다.
함수가 실패하면 반환 값은 다음 오류 코드 중 하나입니다.
반환 코드 | 설명 |
---|---|
|
pIpForwardTable 매개 변수가 가리키는 버퍼가 충분히 크지 않습니다. 필요한 크기는 pdwSize 매개 변수가 가리키는 DWORD 변수에 반환됩니다. |
|
pdwSize 매개 변수가 NULL이거나 GetIpForwardTable이 pdwSize 매개 변수가 가리키는 메모리에 쓸 수 없습니다. |
|
사용할 수 있는 데이터가 없습니다. 이 오류는 로컬 컴퓨터에 경로가 없는 경우 반환됩니다. |
|
이 함수는 로컬 시스템에서 사용 중인 운영 체제에서 지원되지 않습니다. 로컬 컴퓨터에 IP 스택이 설치되어 있지 않으면 이 오류가 반환됩니다. |
|
FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다. |
설명
MIB_IPFORWARDROW 구조체의 dwForwardProto 멤버는 경로를 생성한 프로토콜 또는 라우팅 메커니즘을 지정합니다. 가능한 프로토콜 및 라우팅 메커니즘 목록은 프로토콜 식별자를 참조하세요.
MIB_IPFORWARDROW 구조체의 dwForwardDest, dwForwardMask 및 dwForwardNextHop 멤버는 네트워크 바이트 순서로 IPv4 주소를 나타냅니다.
MIB_IPFORWARDROW 구조체의 dwForwardDest 멤버에 있는 0.0.0.0의 IPv4 주소는 기본 경로로 간주됩니다. MIB_IPFORWARDTABLE여러 네트워크 어댑터가 설치된 경우 dwForwardDest 멤버가 0.0.0.0으로 설정된 여러 MIB_IPFORWARDROW 항목을 포함할 수 있습니다.
dwForwardAge를 INFINITE로 설정하면 시간 제한에 따라 경로가 제거되지 않습니다.
값입니다. dwForwardAge에 대한 다른 값은 경로가 네트워크 라우팅 테이블에서 추가되거나 수정된 이후의 시간(초)을 지정합니다.
RRAS(라우팅 및 원격 액세스 서비스)가 실행 중인 Windows Server 2003 또는 Windows 2000 Server에서 반환된 MIB_IPFORWARDROW 항목에는 dwForwardType 및 dwForwardAge 멤버가 0으로 설정됩니다.
Windows Vista 및 Windows Server 2008에서 MIB_IPFORWARDROW 구조체의 dwForwardMetric1 멤버에 지정된 경로 메트릭은 연결된 인터페이스의 MIB_IPINTERFACE_ROW구조의메트릭 멤버에 지정된 인터페이스 메트릭에 추가된 경로 메트릭의 조합을 나타냅니다. 따라서 MIB_IPFORWARDROW 구조체의 dwForwardMetric1 멤버는 연결된 MIB_IPINTERFACE_ROW 구조체의 메트릭 멤버보다 크거나 같아야 합니다. 애플리케이션이 Windows Vista 및 Windows Server 2008에서 경로 메트릭을 0으로 설정하려는 경우 MIB_IPFORWARDROW 구조체의 dwForwardMetric1 멤버는 연결된 MIB_IPINTERFACE_ROW 구조체의 메트릭 멤버에 지정된 인터페이스 메트릭 값과 동일하게 설정되어야 합니다. 애플리케이션은 GetIpInterfaceEntry 함수를 호출하여 인터페이스 메트릭을 검색할 수 있습니다.
GetIpForwardTable에서 반환된 MIB_IPFORWARDROW 구조체 항목의 멤버 수는 현재 IPv4 라우팅에서 사용되지 않습니다. 이러한 멤버에는 dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 및 dwForwardMetric5가 포함됩니다.
예제
다음 예제에서는 IP 라우팅 테이블을 검색한 다음 테이블의 각 경로에 대한 일부 필드를 인쇄합니다.
// Need to link with Ws2_32.lib and Iphlpapi.lib
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int main()
{
// Declare and initialize variables.
/* variables used for GetIfForwardTable */
PMIB_IPFORWARDTABLE pIpForwardTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
struct in_addr IpAddr;
int i;
pIpForwardTable =
(MIB_IPFORWARDTABLE *) MALLOC(sizeof (MIB_IPFORWARDTABLE));
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pIpForwardTable);
pIpForwardTable = (MIB_IPFORWARDTABLE *) MALLOC(dwSize);
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
}
/* Note that the IPv4 addresses returned in
* GetIpForwardTable entries are in network byte order
*/
if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
printf("\tNumber of entries: %d\n",
(int) pIpForwardTable->dwNumEntries);
for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
/* Convert IPv4 addresses to strings */
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardDest;
strcpy_s(szDestIp, sizeof (szDestIp), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardMask;
strcpy_s(szMaskIp, sizeof (szMaskIp), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardNextHop;
strcpy_s(szGatewayIp, sizeof (szGatewayIp), inet_ntoa(IpAddr));
printf("\n\tRoute[%d] Dest IP: %s\n", i, szDestIp);
printf("\tRoute[%d] Subnet Mask: %s\n", i, szMaskIp);
printf("\tRoute[%d] Next Hop: %s\n", i, szGatewayIp);
printf("\tRoute[%d] If Index: %ld\n", i,
pIpForwardTable->table[i].dwForwardIfIndex);
printf("\tRoute[%d] Type: %ld - ", i,
pIpForwardTable->table[i].dwForwardType);
switch (pIpForwardTable->table[i].dwForwardType) {
case MIB_IPROUTE_TYPE_OTHER:
printf("other\n");
break;
case MIB_IPROUTE_TYPE_INVALID:
printf("invalid route\n");
break;
case MIB_IPROUTE_TYPE_DIRECT:
printf("local route where next hop is final destination\n");
break;
case MIB_IPROUTE_TYPE_INDIRECT:
printf
("remote route where next hop is not final destination\n");
break;
default:
printf("UNKNOWN Type value\n");
break;
}
printf("\tRoute[%d] Proto: %ld - ", i,
pIpForwardTable->table[i].dwForwardProto);
switch (pIpForwardTable->table[i].dwForwardProto) {
case MIB_IPPROTO_OTHER:
printf("other\n");
break;
case MIB_IPPROTO_LOCAL:
printf("local interface\n");
break;
case MIB_IPPROTO_NETMGMT:
printf("static route set through network management \n");
break;
case MIB_IPPROTO_ICMP:
printf("result of ICMP redirect\n");
break;
case MIB_IPPROTO_EGP:
printf("Exterior Gateway Protocol (EGP)\n");
break;
case MIB_IPPROTO_GGP:
printf("Gateway-to-Gateway Protocol (GGP)\n");
break;
case MIB_IPPROTO_HELLO:
printf("Hello protocol\n");
break;
case MIB_IPPROTO_RIP:
printf("Routing Information Protocol (RIP)\n");
break;
case MIB_IPPROTO_IS_IS:
printf
("Intermediate System-to-Intermediate System (IS-IS) protocol\n");
break;
case MIB_IPPROTO_ES_IS:
printf("End System-to-Intermediate System (ES-IS) protocol\n");
break;
case MIB_IPPROTO_CISCO:
printf("Cisco Interior Gateway Routing Protocol (IGRP)\n");
break;
case MIB_IPPROTO_BBN:
printf("BBN Internet Gateway Protocol (IGP) using SPF\n");
break;
case MIB_IPPROTO_OSPF:
printf("Open Shortest Path First (OSPF) protocol\n");
break;
case MIB_IPPROTO_BGP:
printf("Border Gateway Protocol (BGP)\n");
break;
case MIB_IPPROTO_NT_AUTOSTATIC:
printf("special Windows auto static route\n");
break;
case MIB_IPPROTO_NT_STATIC:
printf("special Windows static route\n");
break;
case MIB_IPPROTO_NT_STATIC_NON_DOD:
printf
("special Windows static route not based on Internet standards\n");
break;
default:
printf("UNKNOWN Proto value\n");
break;
}
printf("\tRoute[%d] Age: %ld\n", i,
pIpForwardTable->table[i].dwForwardAge);
printf("\tRoute[%d] Metric1: %ld\n", i,
pIpForwardTable->table[i].dwForwardMetric1);
}
FREE(pIpForwardTable);
return 0;
} else {
printf("\tGetIpForwardTable failed.\n");
FREE(pIpForwardTable);
return 1;
}
}
요구 사항
지원되는 최소 클라이언트 | Windows 2000 Professional[데스크톱 앱만] |
지원되는 최소 서버 | Windows 2000 Server[데스크톱 앱만] |
대상 플랫폼 | Windows |
헤더 | iphlpapi.h |
라이브러리 | Iphlpapi.lib |
DLL | Iphlpapi.dll |