다음을 통해 공유


MIB_UNICASTIPADDRESS_ROW 구조체(netioapi.h)

MIB_UNICASTIPADDRESS_ROW 구조체는 유니캐스트 IP 주소에 대한 정보를 저장합니다.

구문

typedef struct _MIB_UNICASTIPADDRESS_ROW {
  SOCKADDR_INET    Address;
  NET_LUID         InterfaceLuid;
  NET_IFINDEX      InterfaceIndex;
  NL_PREFIX_ORIGIN PrefixOrigin;
  NL_SUFFIX_ORIGIN SuffixOrigin;
  ULONG            ValidLifetime;
  ULONG            PreferredLifetime;
  UINT8            OnLinkPrefixLength;
  BOOLEAN          SkipAsSource;
  NL_DAD_STATE     DadState;
  SCOPE_ID         ScopeId;
  LARGE_INTEGER    CreationTimeStamp;
} MIB_UNICASTIPADDRESS_ROW, *PMIB_UNICASTIPADDRESS_ROW;

멤버

Address

형식: SOCKADDR_INET

유니캐스트 IP 주소입니다. 이 멤버는 IPv6 주소 또는 IPv4 주소일 수 있습니다.

InterfaceLuid

형식: NET_LUID

이 IP 주소와 연결된 네트워크 인터페이스에 대한 LUID(로컬 고유 식별자)입니다.

InterfaceIndex

형식: NET_IFINDEX

이 IP 주소와 연결된 네트워크 인터페이스의 로컬 인덱스 값입니다. 이 인덱스 값은 네트워크 어댑터를 사용하지 않도록 설정한 다음 사용하도록 설정한 경우 또는 다른 상황에서는 변경될 수 있으며 영구로 간주해서는 안 됩니다.

PrefixOrigin

형식: NL_PREFIX_ORIGIN

주소 IP의 접두사 또는 네트워크 부분의 원본입니다. 이 멤버는 Nldef.h 헤더 파일에 정의된 NL_PREFIX_ORIGIN 열거형 형식의 값 중 하나일 수 있습니다.

의미
IpPrefixOriginOther
0
IP 주소 접두사는 이 열거형에 정의된 것 이외의 원본을 사용하여 구성되었습니다. 이 값은 IPv6 또는 IPv4 주소에 적용됩니다.
IpPrefixOriginManual
1
IP 주소 접두사를 수동으로 구성했습니다. 이 값은 IPv6 또는 IPv4 주소에 적용됩니다.
IpPrefixOriginWellKnown
2
IP 주소 접두사는 잘 알려진 주소를 사용하여 구성되었습니다. 이 값은 IPv6 링크-로컬 주소 또는 IPv6 루프백 주소에 적용됩니다.
IpPrefixOriginDhcp
3
IP 주소 접두사는 DHCP를 사용하여 구성되었습니다. 이 값은 DHCP를 사용하여 구성된 IPv4 주소 또는 DHCPv6을 사용하여 구성된 IPv6 주소에 적용됩니다.
IpPrefixOriginRouterAdvertisement
4
IP 주소 접두사는 라우터 보급 알림을 사용하여 구성되었습니다. 이 값은 라우터 보급 알림을 받은 후 생성된 익명 IPv6 주소에 적용할 수 있습니다.
IpPrefixOriginUnchanged
16
IP 주소 접두사는 변경되지 않아야 합니다. 이 값은 IP 접두사 원본에 대한 값을 변경하지 않아야 하는 경우 유니캐스트 IP 인터페이스의 속성을 설정할 때 사용됩니다.

SuffixOrigin

형식: NL_SUFFIX_ORIGIN

주소 IP의 접미사 또는 호스트 부분의 원본입니다. 이 멤버는 Nldef.h 헤더 파일에 정의된 NL_SUFFIX_ORIGIN 열거형 형식의 값 중 하나일 수 있습니다.

의미
IpSuffixOriginOther
0
IP 주소 접미사는 이 열거형에 정의된 것 이외의 원본을 사용하여 구성되었습니다. 이 값은 IPv6 또는 IPv4 주소에 적용됩니다.
IpSuffixOriginManual
1
IP 주소 접미사가 수동으로 구성되었습니다. 이 값은 IPv6 또는 IPv4 주소에 적용됩니다.
IpSuffixOriginWellKnown
2
IP 주소 접미사는 잘 알려진 주소를 사용하여 구성되었습니다. 이 값은 IPv6 링크-로컬 주소 또는 IPv6 루프백 주소에 적용됩니다.
IpSuffixOriginDhcp
3
IP 주소 접미사는 DHCP를 사용하여 구성되었습니다. 이 값은 DHCP를 사용하여 구성된 IPv4 주소 또는 DHCPv6을 사용하여 구성된 IPv6 주소에 적용됩니다.
IpSuffixOriginLinkLayerAddress
4
IP 주소 접미사는 링크 로컬 주소였습니다. 이 값은 라우터 보급 알림을 기반으로 네트워크 부분이 생성되고 호스트 부분이 MAC 하드웨어 주소를 기반으로 하는 IPv6 링크-로컬 주소 또는 IPv6 주소에 적용됩니다.
IpSuffixOriginRandom
5
IP 주소 접미사가 임의로 생성되었습니다. 이 값은 라우터 보급 알림을 받은 후 주소의 호스트 부분이 MAC 하드웨어 주소에서 임의로 생성된 익명 IPv6 주소에 적용됩니다.
IpSuffixOriginUnchanged
16
IP 주소 접미사는 변경되지 않아야 합니다. 이 값은 IP 접미사 원본에 대한 값을 변경하지 않아야 하는 경우 유니캐스트 IP 인터페이스의 속성을 설정할 때 사용됩니다.

ValidLifetime

형식: ULONG

IP 주소가 유효한 최대 시간(초)입니다. 0xffffffff 값은 무한으로 간주됩니다.

PreferredLifetime

형식: ULONG

IP 주소가 유효한 기본 설정 시간(초)입니다. 0xffffffff 값은 무한으로 간주됩니다.

OnLinkPrefixLength

형식: UINT8

IP 주소의 접두사 또는 네트워크 부분의 길이(비트)입니다. 유니캐스트 IPv4 주소의 경우 32보다 큰 값은 잘못된 값입니다. 유니캐스트 IPv6 주소의 경우 128보다 큰 값은 잘못된 값입니다. 값 255는 일반적으로 잘못된 값을 나타내는 데 사용됩니다.

SkipAsSource

형식: BOOLEAN

이 멤버는 주소를 IP 원본 주소로 사용할 수 있는지를 지정합니다.

DadState

형식: NL_DAD_STATE

DAD(중복 주소 검색) 상태입니다. 중복 주소 검색은 IPv6 및 IPv4 주소 모두에 적용됩니다. 이 멤버는 Nldef.h 헤더 파일에 정의된 NL_DAD_STATE 열거형 형식의 값 중 하나일 수 있습니다.

의미
IpDadStateInvalid
0
DAD 상태가 잘못되었습니다.
IpDadStateTentative
1
DAD 상태는 미정입니다.
IpDadStateDuplicate
2
중복된 IP 주소가 검색되었습니다.
IpDadStateDeprecated
3
IP 주소가 더 이상 사용되지 않습니다.
IpDadStateP 참조
4
IP 주소가 기본 주소입니다.

ScopeId

형식: SCOPE_ID

IP 주소의 scope ID입니다. 이 멤버는 IPv6 주소에만 적용됩니다. 이 멤버를 설정할 수 없습니다. 주소가 추가된 인터페이스에 의해 자동으로 결정됩니다.

CreationTimeStamp

형식: LARGE_INTEGER

IP 주소를 만들 때의 타임스탬프를 반환합니다.

설명

MIB_UNICASTIPADDRESS_ROW 구조체는 Windows Vista 이상에서 정의됩니다.

MIB_UNICASTIPADDRESS_ROW 구조의 SkipAsSource 멤버는 Windows 소켓에서 getaddrinfo, GetAddrInfoWGetAddrInfoEx 함수의 작업에 영향을 줍니다. getaddrinfo 또는 GetAddrInfoW 함수에 전달된 pNodeName 매개 변수 또는 GetAddrInfoEx 함수에 전달된 pName 매개 변수가 컴퓨터 이름을 가리키는 경우 원본 주소로 사용할 수 있는 컴퓨터의 모든 영구 주소가 반환됩니다. Windows Vista 이상에서 이러한 주소에는 MIB_UNICASTIPADDRESS_ROW 구조에서SkipAsSource 멤버가 false로 설정된 GetUnicastIpAddressTable 또는 GetUnicastIpAddressEntry 함수에서 반환된 모든 유니캐스트 IP 주소가 포함됩니다.

pNodeName 또는 pName 매개 변수가 클러스터 가상 서버 이름을 참조하는 경우 가상 서버 주소만 반환됩니다. Windows Vista 이상에서 이러한 주소에는 MIB_UNICASTIPADDRESS_ROW 구조에서SkipAsSource 멤버가 true로 설정된 GetUnicastIpAddressTable 또는 GetUnicastIpAddressEntry 함수에서 반환된 모든 유니캐스트 IP 주소가 포함됩니다. 클러스터링 대한 자세한 내용은 Windows 클러스터링을 참조하세요.

WINDOWS 7 sp1(서비스 팩 1) 및 Windows Server 2008 R2 SP1(서비스 팩 1)은 IP 주소에서 SkipAsSource 특성을 설정하기 위한 Netsh.exe 지원을 추가합니다. 또한 이 핫픽스는 MIB_UNICASTIPADDRESS_ROW 구조의 SkipAsSource 멤버가 false로 설정된 경우 IP 주소가 DNS에 등록되도록 동작을 변경합니다. SkipAsSource 멤버가 true로 설정된 경우 IP 주소가 DNS에 등록되지 않습니다.

IP 주소에서 SkipAsSource 특성을 설정하기 위한 Netsh.exe 지원을 추가하는 Windows 7 및 Windows Server 2008 R2에 핫픽스를 사용할 수 있습니다. 또한 이 핫픽스는 MIB_UNICASTIPADDRESS_ROW 구조의 SkipAsSource 멤버가 false로 설정된 경우 IP 주소가 DNS에 등록되도록 동작을 변경합니다. SkipAsSource 멤버가 true로 설정된 경우 IP 주소가 DNS에 등록되지 않습니다. 자세한 내용은 기술 자료(KB) 2386184 참조하세요.

IP 주소에서 SkipAsSource 특성을 설정하기 위한 Netsh.exe 지원을 추가하는 SP2(서비스 팩 2) 및 Windows Server 2008 SP2(서비스 팩 2)를 사용하는 Windows Vista에서도 비슷한 핫픽스를 사용할 수 있습니다. 또한 이 핫픽스는 MIB_UNICASTIPADDRESS_ROW 구조의 SkipAsSource 멤버가 false로 설정된 경우 IP 주소가 DNS에 등록되도록 동작을 변경합니다. SkipAsSource 멤버가 true로 설정된 경우 IP 주소가 DNS에 등록되지 않습니다.

예제

다음 예제에서는 유니캐스트 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 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
머리글 netioapi.h(Iphlpapi.h 포함)

추가 정보

CreateUnicastIpAddressEntry

DeleteUnicastIpAddressEntry

GetAddrInfoEx

GetAddrInfoW

GetUnicastIpAddressEntry

GetUnicastIpAddressTable

InitializeUnicastIpAddressEntry

MIB_UNICASTIPADDRESS_TABLE

SOCKADDR_INET

SetUnicastIpAddressEntry

getaddrinfo