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 .
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 .
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 .
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) |