다음을 통해 공유


GetIpNetTable2 함수(netioapi.h)

GetIpNetTable2 함수는 로컬 컴퓨터에서 IP 인접 테이블을 검색합니다.

통사론

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpNetTable2(
  [in]  ADDRESS_FAMILY    Family,
  [out] PMIB_IPNET_TABLE2 *Table
);

매개 변수

[in] Family

검색할 주소 패밀리입니다.

주소 패밀리의 가능한 값은 Winsock2.h 헤더 파일에 나열됩니다. AF_ 주소 패밀리 및 PF_ 프로토콜 패밀리 상수의 값은 동일하므로(예: AF_INETPF_INET) 상수 중 하나를 사용할 수 있습니다.

Windows Vista 이상용으로 릴리스된 Windows SDK에서 헤더 파일의 구성이 변경되었으며 이 멤버에 대한 가능한 값은 Ws2def.h 헤더 파일에 정의됩니다. Ws2def.h 헤더 파일은 Winsock2.h자동으로 포함되며 직접 사용하면 안 됩니다.

현재 지원되는 값은 AF_INET, AF_INET6AF_UNSPEC.

의미
AF_UNSPEC
0
주소 패밀리가 지정되지 않았습니다. 이 매개 변수를 지정하면 이 함수는 IPv4 및 IPv6 항목을 모두 포함하는 인접 IP 주소 테이블을 반환합니다.
AF_INET
2
IPv4(인터넷 프로토콜 버전 4) 주소 패밀리입니다. 이 매개 변수를 지정하면 이 함수는 IPv4 항목만 포함하는 인접 IP 주소 테이블을 반환합니다.
AF_INET6
23
IPv6(인터넷 프로토콜 버전 6) 주소 패밀리입니다. 이 매개 변수를 지정하면 이 함수는 IPv6 항목만 포함하는 인접 IP 주소 테이블을 반환합니다.

[out] Table

로컬 컴퓨터의 인접 IP 주소 항목 테이블을 포함하는 MIB_IPNET_TABLE2 구조체에 대한 포인터에 대한 포인터입니다.

반환 값

함수가 성공하면 반환 값이 NO_ERROR 또는 ERROR_NOT_FOUND.

함수가 실패하거나 데이터를 반환하지 않으면 반환 값은 다음 오류 코드 중 하나입니다.

반환 코드 묘사
ERROR_INVALID_PARAMETER
잘못된 매개 변수가 함수에 전달되었습니다. 이 오류는 NULL 포인터가 Table 매개 변수에 전달되거나 Family 매개 변수가 AF_INET, AF_INET6또는 AF_UNSPEC지정되지 않은 경우 반환됩니다.
ERROR_NOT_ENOUGH_MEMORY
메모리 리소스가 부족하여 작업을 완료할 수 있습니다.
ERROR_NOT_FOUND
Family 매개 변수에 지정된 인접 IP 주소 항목을 찾을 수 없습니다.

이 반환 값은 GetIpNetTable2 함수에 대한 호출이 성공했지만 반환할 데이터가 없음을 나타냅니다. 이 문제는 Family 매개 변수에 AF_INET 지정되고 반환할 ARP 항목이 없는 경우에 발생할 수 있습니다.

ERROR_NOT_SUPPORTED
요청이 지원되지 않습니다.

이 오류는 로컬 컴퓨터에 IPv4 스택이 없고 Family 매개 변수에 AF_INET 지정한 경우 반환됩니다. 이 오류는 로컬 컴퓨터에 IPv6 스택이 없고 Family 매개 변수에 AF_INET6 지정한 경우에도 반환됩니다. 이 오류는 이 함수가 지원되지 않는 Windows 버전에서도 반환됩니다.

기타
FormatMessage 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

발언

GetIpNetTable2 함수는 Windows Vista 이상에서 정의됩니다.

다음을 실행합니다.
GetIpNetTable2 함수는 로컬 시스템의 인접 IP 주소를 열거하고 이 정보를 MIB_IPNET_TABLE2 구조로 반환합니다.

인접 IP 주소 항목은 Table 매개 변수가 가리키는 버퍼의 MIB_IPNET_TABLE2 구조로 반환됩니다. MIB_IPNET_TABLE2 구조에는 인접 IP 주소 항목 수와 각 인접 IP 주소 항목에 대한 MIB_IPNET_ROW2 구조의 배열이 포함됩니다. 이러한 반환된 구조체가 더 이상 필요하지 않으면 FreeMibTable호출하여 메모리를 해제합니다.

Family 매개 변수는 AF_INET, AF_INET6또는 AF_UNSPEC초기화해야 합니다.

Table 매개 변수가 가리키는 반환된 MIB_IPNET_TABLE2 구조체에는 NumEntries 멤버와 MIB_IPNET_TABLE2 구조체의 Table 멤버에 있는 첫 번째 MIB_IPNET_ROW2 배열 항목 간의 맞춤을 위한 패딩이 포함될 수 있습니다. 정렬에 대한 안쪽 여백은 MIB_IPNET_ROW2 배열 항목 사이에도 있을 수 있습니다. MIB_IPNET_ROW2 배열 항목에 대한 액세스는 패딩이 있을 수 있다고 가정해야 합니다.

예제

다음 예제에서는 IP 인접 테이블을 검색한 다음 표의 IP 인접 행 항목에 대한 값을 출력합니다.

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

int main()
{

    // Declare and initialize variables

    int i;
    unsigned int j;
    unsigned long status = 0;

    PMIB_IPNET_TABLE2 pipTable = NULL;
//    MIB_IPNET_ROW2 ipRow;

    status = GetIpNetTable2(AF_INET, &pipTable);
    if (status != NO_ERROR) {
        printf("GetIpNetTable for IPv4 table returned error: %ld\n", status);
        exit(1);
    }
    // Print some variables from the table
    printf("Number of IPv4 table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; (unsigned) i < pipTable->NumEntries; i++) {
//        printf("Table entry: %d\n", i);
        printf("IPv4 Address[%d]:\t %s\n", (int) i,
               inet_ntoa(pipTable->Table[i].Address.Ipv4.sin_addr));
        printf("Interface index[%d]:\t\t %lu\n", (int) i,
               pipTable->Table[i].InterfaceIndex);

        printf("Interface LUID NetLuidIndex[%d]:\t %lu\n",
               (int) i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);
        printf("Interface LUID IfType[%d]: ", (int) i);
        switch (pipTable->Table[i].InterfaceLuid.Info.IfType) {
        case IF_TYPE_OTHER:
            printf("Other\n");
            break;
        case IF_TYPE_ETHERNET_CSMACD:
            printf("Ethernet\n");
            break;
        case IF_TYPE_ISO88025_TOKENRING:
            printf("Token ring\n");
            break;
        case IF_TYPE_PPP:
            printf("PPP\n");
            break;
        case IF_TYPE_SOFTWARE_LOOPBACK:
            printf("Software loopback\n");
            break;
        case IF_TYPE_ATM:
            printf("ATM\n");
            break;
        case IF_TYPE_IEEE80211:
            printf("802.11 wireless\n");
            break;
        case IF_TYPE_TUNNEL:
            printf("Tunnel encapsulation\n");
            break;
        case IF_TYPE_IEEE1394:
            printf("IEEE 1394 (Firewire)\n");
            break;
        default:
            printf("Unknown: %d\n",
                   pipTable->Table[i].InterfaceLuid.Info.IfType);
            break;
        }

        printf("Physical Address[%d]:\t ", (int) i);
        if (pipTable->Table[i].PhysicalAddressLength == 0)
            printf("\n");
//        for (j = 0; (unsigned) j < pipTable->Table[i].PhysicalAddressLength; j++)
//         printf ("%c" 
        for (j = 0; j < pipTable->Table[i].PhysicalAddressLength; j++) {
            if (j == (pipTable->Table[i].PhysicalAddressLength - 1))
                printf("%.2X\n", (int) pipTable->Table[i].PhysicalAddress[j]);
            else
                printf("%.2X-", (int) pipTable->Table[i].PhysicalAddress[j]);
        }

        printf("Physical Address Length[%d]:\t %lu\n", (int) i,
               pipTable->Table[i].PhysicalAddressLength);

        printf("Neighbor State[%d]:\t ", (int) i);
        switch (pipTable->Table[i].State) {
        case NlnsUnreachable:
            printf("NlnsUnreachable\n");
            break;
        case NlnsIncomplete:
            printf("NlnsIncomplete\n");
            break;
        case NlnsProbe:
            printf("NlnsProbe\n");
            break;
        case NlnsDelay:
            printf("NlnsDelay\n");
            break;
        case NlnsStale:
            printf("NlnsStale\n");
            break;
        case NlnsReachable:
            printf("NlnsReachable\n");
            break;
        case NlnsPermanent:
            printf("NlnsPermanent\n");
            break;
        default:
            printf("Unknown: %d\n", pipTable->Table[i].State);
            break;
        }

        printf("Flags[%d]:\t\t %u\n", (int) i,
               (unsigned char) pipTable->Table[i].Flags);

        printf("ReachabilityTime[%d]:\t %lu\n\n", (int) i,
               pipTable->Table[i].ReachabilityTime);

    }
    FreeMibTable(pipTable);
    pipTable = NULL;

    exit(0);
}

요구 사항

요구
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 netioapi.h(Iphlpapi.h 포함)
라이브러리 Iphlpapi.lib
DLL Iphlpapi.dll

참고 항목

CreateIpNetEntry2

flushIpNetTable2

freeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

setIpNetEntry2