estructura MIB_UNICASTIPADDRESS_ROW (netioapi.h)

La estructura MIB_UNICASTIPADDRESS_ROW almacena información sobre una dirección IP de unidifusión.

Sintaxis

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;

Miembros

Address

Tipo: SOCKADDR_INET

Dirección IP de unidifusión. Este miembro puede ser una dirección IPv6 o una dirección IPv4.

InterfaceLuid

Tipo: NET_LUID

Identificador único local (LUID) de la interfaz de red asociada a esta dirección IP.

InterfaceIndex

Tipo: NET_IFINDEX

Valor de índice local para la interfaz de red asociada a esta dirección IP. Este valor de índice puede cambiar cuando un adaptador de red está deshabilitado y, a continuación, habilitado, o en otras circunstancias, y no debe considerarse persistente.

PrefixOrigin

Tipo: NL_PREFIX_ORIGIN

Origen del prefijo o parte de red de la dirección IP. Este miembro puede ser uno de los valores del tipo de enumeración NL_PREFIX_ORIGIN definido en el archivo de encabezado Nldef.h .

Valor Significado
IpPrefixOriginOther
0
El prefijo de dirección IP se configuró mediante un origen distinto de los definidos en esta enumeración. Este valor es aplicable a una dirección IPv6 o IPv4.
IpPrefixOriginManual
1
El prefijo de dirección IP se configuró manualmente. Este valor es aplicable a una dirección IPv6 o IPv4.
IpPrefixOriginWellKnown
2
El prefijo de dirección IP se configuró mediante una dirección conocida. Este valor se aplica a una dirección local de vínculo IPv6 o a una dirección de bucle invertido IPv6.
IpPrefixOriginDhcp
3
El prefijo de dirección IP se configuró mediante DHCP. Este valor se aplica a una dirección IPv4 configurada mediante DHCP o una dirección IPv6 configurada mediante DHCPv6.
IpPrefixOriginRouterAdvertisement
4
El prefijo de dirección IP se configuró mediante el anuncio del enrutador. Este valor es aplicable a una dirección IPv6 anónima que se generó después de recibir un anuncio de enrutador.
IpPrefixOriginUnchanged
16
El prefijo de dirección IP debe no modificarse. Este valor se usa al establecer las propiedades de una interfaz IP de unidifusión cuando el valor del origen del prefijo IP no debe modificarse.

SuffixOrigin

Tipo: NL_SUFFIX_ORIGIN

Origen del sufijo o parte host de la dirección IP. Este miembro puede ser uno de los valores del tipo de enumeración NL_SUFFIX_ORIGIN definido en el archivo de encabezado Nldef.h .

Valor Significado
IpSuffixOriginOther
0
El sufijo de dirección IP se configuró mediante un origen distinto de los definidos en esta enumeración. Este valor es aplicable a una dirección IPv6 o IPv4.
IpSuffixOriginManual
1
El sufijo de dirección IP se configuró manualmente. Este valor es aplicable a una dirección IPv6 o IPv4.
IpSuffixOriginWellKnown
2
El sufijo de dirección IP se configuró mediante una dirección conocida. Este valor se aplica a una dirección local de vínculo IPv6 o a una dirección de bucle invertido IPv6.
IpSuffixOriginDhcp
3
El sufijo de dirección IP se configuró mediante DHCP. Este valor se aplica a una dirección IPv4 configurada mediante DHCP o una dirección IPv6 configurada mediante DHCPv6.
IpSuffixOriginLinkLayerAddress
4
El sufijo de dirección IP era la dirección local del vínculo. Este valor es aplicable a una dirección local de vínculo IPv6 o a una dirección IPv6 donde se generó el elemento de red en función de un anuncio de enrutador y el elemento host se basaba en la dirección de hardware MAC.
IpSuffixOriginRandom
5
El sufijo de dirección IP se generó aleatoriamente. Este valor es aplicable a una dirección IPv6 anónima donde la parte host de la dirección se generó aleatoriamente desde la dirección de hardware MAC después de recibir un anuncio de enrutador.
IpSuffixOriginUnchanged
16
El sufijo de dirección IP debe no modificarse. Este valor se usa al establecer las propiedades de una interfaz IP de unidifusión cuando el valor del origen del sufijo IP no debe modificarse.

ValidLifetime

Tipo: ULONG

Tiempo máximo, en segundos, que la dirección IP es válida. Un valor de 0xffffffff se considera infinito.

PreferredLifetime

Tipo: ULONG

El tiempo preferido, en segundos, que la dirección IP es válida. Un valor de 0xffffffff se considera infinito.

OnLinkPrefixLength

Tipo: UINT8

Longitud, en bits, del prefijo o parte de red de la dirección IP. Para una dirección IPv4 de unidifusión, cualquier valor mayor que 32 es un valor no válido. Para una dirección IPv6 de unidifusión, cualquier valor mayor que 128 es un valor no válido. Un valor de 255 se usa normalmente para representar un valor no válido.

SkipAsSource

Tipo: BOOLEAN

Este miembro especifica si la dirección se puede usar como una dirección de origen IP.

DadState

Tipo: NL_DAD_STATE

Estado de detección de direcciones duplicadas (DAD). La detección de direcciones duplicadas se aplica a las direcciones IPv6 e IPv4. Este miembro puede ser uno de los valores del tipo de enumeración NL_DAD_STATE definido en el archivo de encabezado Nldef.h .

Valor Significado
IpDadStateInvalid
0
El estado DAD no es válido.
IpDadStateTentative
1
El estado DAD es provisional.
IpDadStateDuplicate
2
Se ha detectado una dirección IP duplicada.
IpDadStateDeprecated
3
La dirección IP está en desuso.
IpDadStatePreferred
4
La dirección IP es la dirección preferida.

ScopeId

Tipo: SCOPE_ID

Identificador de ámbito de la dirección IP. Este miembro solo es aplicable a una dirección IPv6. No se puede establecer este miembro. Se determina automáticamente por la interfaz en la que se agregó la dirección.

CreationTimeStamp

Tipo: LARGE_INTEGER

Marca de tiempo cuando se creó la dirección IP.

Comentarios

La estructura MIB_UNICASTIPADDRESS_ROW se define en Windows Vista y versiones posteriores.

El miembro SkipAsSource de la estructura MIB_UNICASTIPADDRESS_ROW afecta al funcionamiento de las funciones getaddrinfo, GetAddrInfoW y GetAddrInfoEx en sockets de Windows. Si el parámetro pNodeName pasado a las funciones getaddrinfo o GetAddrInfoW o el parámetro pName pasado a la función GetAddrInfoEx apunta a un nombre de equipo, se devuelven todas las direcciones permanentes del equipo que se pueden usar como dirección de origen. En Windows Vista y versiones posteriores, estas direcciones incluirían todas las direcciones IP de unidifusión devueltas por las funciones GetUnicastIpAddressTable o GetUnicastIpAddressEntry en las que el miembro SkipAsSource se establece en false en la estructura MIB_UNICASTIPADDRESS_ROW .

Si el parámetro pNodeName o pName hace referencia a un nombre de servidor virtual de clúster, solo se devuelven las direcciones del servidor virtual. En Windows Vista y versiones posteriores, estas direcciones incluirían todas las direcciones IP de unidifusión devueltas por las funciones GetUnicastIpAddressTable o GetUnicastIpAddressEntry en las que el miembro SkipAsSource se establece en true en la estructura MIB_UNICASTIPADDRESS_ROW . Consulte Clústeres de Windows para obtener más información sobre la agrupación en clústeres.

Windows 7 con Service Pack 1 (SP1) y Windows Server 2008 R2 con Service Pack 1 (SP1) agregan compatibilidad a Netsh.exe para establecer el atributo SkipAsSource en una dirección IP. Esta revisión también cambia el comportamiento de modo que si el miembro SkipAsSource de la estructura MIB_UNICASTIPADDRESS_ROW está establecido en false, la dirección IP se registrará en DNS. Si el miembro SkipAsSource se establece en true, la dirección IP no se registra en DNS.

Hay disponible una revisión para Windows 7 y Windows Server 2008 R2 que agrega compatibilidad a Netsh.exe para establecer el atributo SkipAsSource en una dirección IP. Esta revisión también cambia el comportamiento de modo que si el miembro SkipAsSource de la estructura MIB_UNICASTIPADDRESS_ROW está establecido en false, la dirección IP se registrará en DNS. Si el miembro SkipAsSource se establece en true, la dirección IP no se registra en DNS. Para obtener más información, vea Knowledge Base (KB) 2386184.

También hay disponible una revisión similar para Windows Vista con Service Pack 2 (SP2) y Windows Server 2008 con Service Pack 2 (SP2) que agrega compatibilidad a Netsh.exe para establecer el atributo SkipAsSource en una dirección IP. Esta revisión también cambia el comportamiento de modo que si el miembro SkipAsSource de la estructura MIB_UNICASTIPADDRESS_ROW está establecido en false, la dirección IP se registrará en DNS. Si el miembro SkipAsSource se establece en true, la dirección IP no se registra en DNS.

Ejemplos

En el ejemplo siguiente se recupera una tabla de direcciones IP de unidifusión y se imprimen algunos valores de cada una de las estructuras 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 Value
Cliente mínimo compatible Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 [solo aplicaciones de escritorio]
Encabezado netioapi.h (incluya Iphlpapi.h)

Consulte también

CreateUnicastIpAddressEntry

DeleteUnicastIpAddressEntry

GetAddrInfoEx

GetAddrInfoW

GetUnicastIpAddressEntry

GetUnicastIpAddressTable

InitializeUnicastIpAddressEntry

MIB_UNICASTIPADDRESS_TABLE

SOCKADDR_INET

SetUnicastIpAddressEntry

getaddrinfo