다음을 통해 공유


GetUnicastIpAddressTable 함수(netioapi.h)

GetUnicastIpAddressTable 함수는 로컬 컴퓨터에서 유니캐스트 IP 주소 테이블을 검색합니다.

구문

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetUnicastIpAddressTable(
  [in]  ADDRESS_FAMILY              Family,
  [out] PMIB_UNICASTIPADDRESS_TABLE *Table
);

매개 변수

[in] Family

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

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

Windows Vista 이상용으로 릴리스된 Windows SDK에서 헤더 파일의 organization 변경되었으며 이 멤버에 대한 가능한 값은 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_UNICASTIPADDRESS_TABLE 구조체에 대한 포인터입니다.

반환 값

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

함수가 실패하면 반환 값은 다음 오류 코드 중 하나입니다.

반환 코드 설명
ERROR_INVALID_PARAMETER
잘못된 매개 변수가 함수에 전달되었습니다. 이 오류는 Table 매개 변수에 NULL 포인터가 전달되거나 Family 매개 변수가 AF_INET, AF_INET6 또는 AF_UNSPEC 지정되지 않은 경우 반환됩니다.
ERROR_NOT_ENOUGH_MEMORY
메모리 리소스가 부족하여 작업을 완료할 수 있습니다.
ERROR_NOT_FOUND
Element not found. Family 매개 변수에 지정된 유니캐스트 IP 주소 항목이 없으면 이 오류가 반환됩니다.
ERROR_NOT_SUPPORTED
요청이 지원되지 않습니다. 이 오류는 로컬 컴퓨터에 IPv4 스택이 없고 Family 매개 변수에 AF_INET 지정한 경우 반환됩니다. 이 오류는 로컬 컴퓨터에 IPv6 스택이 없고 family 매개 변수에 AF_INET6 지정한 경우에도 반환됩니다. 이 오류는 이 함수가 지원되지 않는 Windows 버전에서도 반환됩니다.
기타
FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

설명

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

The
GetUnicastIpAddressTable 함수는 로컬 시스템에서 유니캐스트 IP 주소를 열거하고 이 정보를 MIB_UNICASTIPADDRESS_TABLE 구조로 반환합니다.

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

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

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

예제

다음 예제에서는 유니캐스트 IP 주소 테이블을 검색하고 검색된 각 MIB_UNICASTIPADDRESS_ROW 구조체에서 일부 값을 출력합니다.


#ifndef UNICODE
#define UNICODE
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <Windows.h.>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

// Need to link with Iphlpapi.lib and Ws2_32.lib
#pragma comment (lib, "iphlpapi.lib")
#pragma comment (lib, "Ws2_32.lib")

int __cdecl wmain()
{

    // Declare and initialize variables

    unsigned int i;

    DWORD Result = 0;

    WCHAR Ipv4String[16] = { 0 };
    WCHAR Ipv6String[46] = { 0 };

    PMIB_UNICASTIPADDRESS_TABLE pipTable = NULL;

    Result = GetUnicastIpAddressTable(AF_UNSPEC, &pipTable);
    if (Result != NO_ERROR) {
        wprintf(L"GetUnicastIpAddressTable returned error: %ld\n", Result);
        exit(1);
    }
    // Print some variables from the rows in the table
    wprintf(L"Number of table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; i < pipTable->NumEntries; i++) {
        wprintf(L"AddressFamily[%d]:\t\t ", i);

        switch (pipTable->Table[i].Address.si_family) {
        case AF_INET:
            wprintf(L"IPv4\n");
            if (InetNtopW
                (AF_INET, &pipTable->Table[i].Address.Ipv4.sin_addr, Ipv4String,
                 16) != NULL)
                wprintf(L"IPv4 Address:\t\t\t %ws\n", Ipv4String);
            break;
        case AF_INET6:
            wprintf(L"IPv6\n");
            if (InetNtopW
                (AF_INET6, &pipTable->Table[i].Address.Ipv6.sin6_addr,
                 Ipv6String, 46) != NULL)
                wprintf(L"IPv6 Address:\t\t\t %ws\n", Ipv6String);
            break;
        default:
            wprintf(L"Other: %d\n", pipTable->Table[i].Address.si_family);
            break;
        }

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

        wprintf(L"Interface Index[%d]:\t\t %lu\n",
               i, pipTable->Table[i].InterfaceIndex);

        wprintf(L"Prefix Origin[%d]:\t\t ", i);
        switch (pipTable->Table[i].PrefixOrigin) {
        case IpPrefixOriginOther:
            wprintf(L"IpPrefixOriginOther\n");
            break;
        case IpPrefixOriginManual:
            wprintf(L"IpPrefixOriginManual\n");
            break;
        case IpPrefixOriginWellKnown:
            wprintf(L"IpPrefixOriginWellKnown\n");
            break;
        case IpPrefixOriginDhcp:
            wprintf(L"IpPrefixOriginDhcp\n");
            break;
        case IpPrefixOriginRouterAdvertisement:
            wprintf(L"IpPrefixOriginRouterAdvertisement\n");
            break;
        case IpPrefixOriginUnchanged:
            wprintf(L"IpPrefixOriginUnchanged\n");
            break;
        default:
            wprintf(L"Unknown: %d\n", pipTable->Table[i].PrefixOrigin);
            break;
        }

        wprintf(L"Suffix Origin[%d]:\t\t ", i);
        switch (pipTable->Table[i].SuffixOrigin) {
        case IpSuffixOriginOther:
            wprintf(L"IpSuffixOriginOther\n");
            break;
        case IpSuffixOriginManual:
            wprintf(L"IpSuffixOriginManual\n");
            break;
        case IpSuffixOriginWellKnown:
            wprintf(L"IpSuffixOriginWellKnown\n");
            break;
        case IpSuffixOriginDhcp:
            wprintf(L"IpSuffixOriginDhcp\n");
            break;
        case IpSuffixOriginLinkLayerAddress:
            wprintf(L"IpSuffixOriginLinkLayerAddress\n");
            break;
        case IpSuffixOriginRandom:
            wprintf(L"IpSuffixOriginRandom\n");
            break;
        case IpSuffixOriginUnchanged:
            wprintf(L"IpSuffixOriginUnchanged\n");
            break;
        default:
            wprintf(L"Unknown: %d\n", pipTable->Table[i].SuffixOrigin);
            break;
        }

        wprintf(L"Valid Lifetime[%d]:\t\t 0x%x (%u)\n", i,
               pipTable->Table[i].ValidLifetime,
               pipTable->Table[i].ValidLifetime);

        wprintf(L"Preferred Lifetime[%d]:\t\t 0x%x (%u)\n", i,
               pipTable->Table[i].PreferredLifetime,
               pipTable->Table[i].PreferredLifetime);

        wprintf(L"OnLink PrefixLength[%d]:\t\t %lu\n", i,
               pipTable->Table[i].OnLinkPrefixLength);

        wprintf(L"Skip As Source[%d]:\t\t ", i);
        if (pipTable->Table[i].SkipAsSource)
            wprintf(L"Yes\n");
        else
            wprintf(L"No\n");

        wprintf(L"Dad State[%d]:\t\t\t ", i);
        switch (pipTable->Table[i].DadState) {
        case IpDadStateInvalid:
            wprintf(L"IpDadStateInvalid\n");
            break;
        case IpDadStateTentative:
            wprintf(L"IpDadStateTentative\n");
            break;
        case IpDadStateDuplicate:
            wprintf(L"IpDadStateDuplicate\n");
            break;
        case IpDadStateDeprecated:
            wprintf(L"IpDadStateDeprecated\n");
            break;
        case IpDadStatePreferred:
            wprintf(L"IpDadStatePreferred\n");
            break;
        default:
            wprintf(L"Unknown: %d\n", pipTable->Table[i].DadState);
            break;
        }

        wprintf(L"\n");
    }

    if (pipTable != NULL) {
        FreeMibTable(pipTable);
        pipTable = NULL;
    }

    exit(0);
}


요구 사항

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

추가 정보

CreateUnicastIpAddressEntry

DeleteUnicastIpAddressEntry

FreeMibTable

GetUnicastIpAddressEntry

IP 도우미 함수 참조

InitializeUnicastIpAddressEntry

MIB_UNICASTIPADDRESS_ROW

MIB_UNICASTIPADDRESS_TABLE

NotifyStableUnicastIpAddressTable

NotifyUnicastIpAddressChange

SetUnicastIpAddressEntry