estrutura MIB_UNICASTIPADDRESS_ROW (netioapi.h)

A estrutura MIB_UNICASTIPADDRESS_ROW armazena informações sobre um endereço IP unicast.

Sintaxe

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;

Membros

Address

Tipo: SOCKADDR_INET

O endereço IP unicast. Esse membro pode ser um endereço IPv6 ou um endereço IPv4.

InterfaceLuid

Tipo: NET_LUID

O LUID (identificador local exclusivo) para o adaptador de rede associado a esse endereço IP.

InterfaceIndex

Tipo: NET_IFINDEX

O valor do índice local para o adaptador de rede associado a esse endereço IP. Esse valor de índice pode ser alterado quando um adaptador de rede é desabilitado e habilitado, ou em outras circunstâncias, e não deve ser considerado persistente.

PrefixOrigin

Tipo: NL_PREFIX_ORIGIN

A origem do prefixo ou da parte de rede do IP do endereço. Esse membro pode ser um dos valores do tipo de enumeração NL_PREFIX_ORIGIN definido no arquivo de cabeçalho Nldef.h .

Valor Significado
IpPrefixOriginOther
0
O prefixo de endereço IP foi configurado usando uma origem diferente daquelas definidas nessa enumeração. Esse valor é aplicável a um endereço IPv6 ou IPv4.
IpPrefixOriginManual
1
O prefixo de endereço IP foi configurado manualmente. Esse valor é aplicável a um endereço IPv6 ou IPv4.
IpPrefixOriginWellKnown
2
O prefixo de endereço IP foi configurado usando um endereço conhecido. Esse valor é aplicável a um endereço IPv6 link-local ou a um endereço de loopback IPv6.
IpPrefixOriginDhcp
3
O prefixo de endereço IP foi configurado usando DHCP. Esse valor é aplicável a um endereço IPv4 configurado usando DHCP ou um endereço IPv6 configurado usando DHCPv6.
IpPrefixOriginRouterAdvertisement
4
O prefixo de endereço IP foi configurado usando o anúncio do roteador. Esse valor é aplicável a um endereço IPv6 anônimo que foi gerado após receber um anúncio de roteador.
IpPrefixOriginUnchanged
16
O prefixo de endereço IP deve ser inalterado. Esse valor é usado ao definir as propriedades de uma interface IP unicast quando o valor da origem do prefixo IP deve ser inalterado.

SuffixOrigin

Tipo: NL_SUFFIX_ORIGIN

A origem do sufixo ou parte do host do IP do endereço. Esse membro pode ser um dos valores do tipo de enumeração NL_SUFFIX_ORIGIN definido no arquivo de cabeçalho Nldef.h .

Valor Significado
IpSuffixOriginOther
0
O sufixo de endereço IP foi configurado usando uma origem diferente daquelas definidas nessa enumeração. Esse valor é aplicável a um endereço IPv6 ou IPv4.
IpSuffixOriginManual
1
O sufixo de endereço IP foi configurado manualmente. Esse valor é aplicável a um endereço IPv6 ou IPv4.
IpSuffixOriginWellKnown
2
O sufixo de endereço IP foi configurado usando um endereço conhecido. Esse valor é aplicável a um endereço IPv6 link-local ou a um endereço de loopback IPv6.
IpSuffixOriginDhcp
3
O sufixo de endereço IP foi configurado usando DHCP. Esse valor é aplicável a um endereço IPv4 configurado usando DHCP ou um endereço IPv6 configurado usando DHCPv6.
IpSuffixOriginLinkLayerAddress
4
O sufixo de endereço IP era o endereço local do link. Esse valor é aplicável a um endereço IPv6 link-local ou a um endereço IPv6 em que a parte de rede foi gerada com base em um anúncio de roteador e a parte do host foi baseada no endereço de hardware MAC.
IpSuffixOriginRandom
5
O sufixo de endereço IP foi gerado aleatoriamente. Esse valor é aplicável a um endereço IPv6 anônimo em que a parte do host do endereço foi gerada aleatoriamente a partir do endereço de hardware MAC depois de receber um anúncio de roteador.
IpSuffixOriginUnchanged
16
O sufixo de endereço IP deve permanecer inalterado. Esse valor é usado ao definir as propriedades de uma interface IP unicast quando o valor da origem do sufixo IP deve ser inalterado.

ValidLifetime

Tipo: ULONG

O tempo máximo, em segundos, em que o endereço IP é válido. Um valor de 0xffffffff é considerado infinito.

PreferredLifetime

Tipo: ULONG

O tempo preferencial, em segundos, em que o endereço IP é válido. Um valor de 0xffffffff é considerado infinito.

OnLinkPrefixLength

Tipo: UINT8

O comprimento, em bits, do prefixo ou da parte de rede do endereço IP. Para um endereço IPv4 unicast, qualquer valor maior que 32 é um valor inválido. Para um endereço IPv6 unicast, qualquer valor maior que 128 é um valor inválido. Um valor de 255 é comumente usado para representar um valor ilegal.

SkipAsSource

Tipo: BOOLEAN

Esse membro especifica se o endereço pode ser usado como um endereço de origem IP.

DadState

Tipo: NL_DAD_STATE

O estado de detecção de endereço duplicado (DAD). A detecção de endereços duplicados é aplicável a endereços IPv6 e IPv4. Esse membro pode ser um dos valores do tipo de enumeração NL_DAD_STATE definido no arquivo de cabeçalho Nldef.h .

Valor Significado
IpDadStateInvalid
0
O estado PAI é inválido.
IpDadStateTentative
1
O estado pai é provisório.
IpDadStateDuplicate
2
Um endereço IP duplicado foi detectado.
IpDadStateDeprecated
3
O endereço IP foi preterido.
IpDadStatePreferred
4
O endereço IP é o endereço preferencial.

ScopeId

Tipo: SCOPE_ID

A ID de escopo do endereço IP. Esse membro é aplicável somente a um endereço IPv6. Este membro não pode ser definido. Ele é determinado automaticamente pela interface na qual o endereço foi adicionado.

CreationTimeStamp

Tipo: LARGE_INTEGER

O carimbo de data/hora quando o endereço IP foi criado.

Comentários

A estrutura de MIB_UNICASTIPADDRESS_ROW é definida no Windows Vista e posterior.

O membro SkipAsSource da estrutura MIB_UNICASTIPADDRESS_ROW afeta a operação das funções getaddrinfo, GetAddrInfoW e GetAddrInfoEx em soquetes do Windows. Se o parâmetro pNodeName for passado para as funções getaddrinfo ou GetAddrInfoW ou o parâmetro pName passado para a função GetAddrInfoEx apontar para um nome de computador, todos os endereços permanentes do computador que podem ser usados como endereço de origem serão retornados. No Windows Vista e posterior, esses endereços incluem todos os endereços IP unicast retornados pelas funções GetUnicastIpAddressTable ou GetUnicastIpAddressEntry nas quais o membro SkipAsSource é definido como false na estrutura MIB_UNICASTIPADDRESS_ROW .

Se o parâmetro pNodeName ou pName se referir a um nome de servidor virtual de cluster, somente endereços de servidor virtual serão retornados. No Windows Vista e posterior, esses endereços incluem todos os endereços IP unicast retornados pelas funções GetUnicastIpAddressTable ou GetUnicastIpAddressEntry nas quais o membro SkipAsSource é definido como true na estrutura MIB_UNICASTIPADDRESS_ROW . Consulte Clustering do Windows para obter mais informações sobre clustering.

O Windows 7 com Service Pack 1 (SP1) e o Windows Server 2008 R2 com Service Pack 1 (SP1) adicionam suporte a Netsh.exe para definir o atributo SkipAsSource em um endereço IP. Esse hotfix também altera o comportamento de modo que, se o membro SkipAsSource na estrutura MIB_UNICASTIPADDRESS_ROW estiver definido como false, o endereço IP será registrado no DNS. Se o membro SkipAsSource estiver definido como true, o endereço IP não será registrado no DNS.

Um hotfix está disponível para Windows 7 e Windows Server 2008 R2 que adiciona suporte a Netsh.exe para definir o atributo SkipAsSource em um endereço IP. Esse hotfix também altera o comportamento de modo que, se o membro SkipAsSource na estrutura MIB_UNICASTIPADDRESS_ROW estiver definido como false, o endereço IP será registrado no DNS. Se o membro SkipAsSource estiver definido como true, o endereço IP não será registrado no DNS. Para obter mais informações, consulte Base de Dados de Conhecimento (KB) 2386184.

Um hotfix semelhante também está disponível para Windows Vista com Service Pack 2 (SP2) e Windows Server 2008 com Service Pack 2 (SP2) que adiciona suporte a Netsh.exe para definir o atributo SkipAsSource em um endereço IP. Esse hotfix também altera o comportamento de modo que, se o membro SkipAsSource na estrutura MIB_UNICASTIPADDRESS_ROW estiver definido como false, o endereço IP será registrado no DNS. Se o membro SkipAsSource estiver definido como true, o endereço IP não será registrado no DNS.

Exemplos

O exemplo a seguir recupera uma tabela de endereços IP unicast e imprime alguns valores de cada uma das estruturas de MIB_UNICASTIPADDRESS_ROW recuperadas.


#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);
}


Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Cabeçalho netioapi.h (inclua Iphlpapi.h)

Confira também

CreateUnicastIpAddressEntry

DeleteUnicastIpAddressEntry

GetAddrInfoEx

GetAddrInfoW

GetUnicastIpAddressEntry

GetUnicastIpAddressTable

InitializeUnicastIpAddressEntry

MIB_UNICASTIPADDRESS_TABLE

SOCKADDR_INET

SetUnicastIpAddressEntry

Getaddrinfo