Función GetUnicastIpAddressTable (netioapi.h)

La función GetUnicastIpAddressTable recupera la tabla de direcciones IP de unidifusión en el equipo local.

Sintaxis

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

Parámetros

[in] Family

Familia de direcciones que se va a recuperar.

Los valores posibles para la familia de direcciones se enumeran en el archivo de encabezado Winsock2.h . Tenga en cuenta que los valores de la familia de direcciones AF_ y las constantes de familia de protocolos PF_ son idénticas (por ejemplo, AF_INET y PF_INET), por lo que se puede usar cualquiera de las constantes.

En windows SDK publicado para Windows Vista y versiones posteriores, la organización de archivos de encabezado ha cambiado y los valores posibles para este miembro se definen en el archivo de encabezado Ws2def.h . Tenga en cuenta que el archivo de encabezado Ws2def.h se incluye automáticamente en Winsock2.h y nunca se debe usar directamente.

Los valores admitidos actualmente son AF_INET, AF_INET6 y AF_UNSPEC.

Valor Significado
AF_UNSPEC
0
No se especifica la familia de direcciones. Cuando se especifica este parámetro, esta función devuelve la tabla de direcciones IP de unidifusión que contiene entradas IPv4 e IPv6.
AF_INET
2
Familia de direcciones del Protocolo de Internet versión 4 (IPv4). Cuando se especifica este parámetro, esta función devuelve la tabla de direcciones IP de unidifusión que contiene solo entradas IPv4.
AF_INET6
23
Familia de direcciones del Protocolo de Internet versión 6 (IPv6). Cuando se especifica este parámetro, esta función devuelve la tabla de direcciones IP de unidifusión que contiene solo entradas IPv6.

[out] Table

Puntero a una estructura de MIB_UNICASTIPADDRESS_TABLE que contiene una tabla de entradas de dirección IP de unidifusión en el equipo local.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es NO_ERROR.

Si se produce un error en la función, el valor devuelto es uno de los siguientes códigos de error.

Código devuelto Descripción
ERROR_INVALID_PARAMETER
Se pasó un parámetro no válido a la función. Este error se devuelve si se pasa un puntero NULL en el parámetro Table o el parámetro Family no se especificó como AF_INET, AF_INET6 o AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Los recursos de memoria insuficientes están disponibles para completar la operación.
ERROR_NOT_FOUND
Elemento no encontrado. Este error se devuelve si no se encontraron entradas de dirección IP de unidifusión como se especifica en el parámetro Family .
ERROR_NOT_SUPPORTED
No se admite la solicitud. Este error se devuelve si no hay ninguna pila IPv4 en el equipo local y AF_INET se especificó en el parámetro Family . Este error también se devuelve si no hay ninguna pila IPv6 en el equipo local y AF_INET6 se especificó en el parámetro Family . Este error también se devuelve en las versiones de Windows en las que no se admite esta función.
Otros
Use FormatMessage para obtener la cadena de mensaje para el error devuelto.

Comentarios

La función GetUnicastIpAddressTable se define en Windows Vista y versiones posteriores.

The
La función GetUnicastIpAddressTable enumera las direcciones IP de unidifusión en un sistema local y devuelve esta información en una estructura MIB_UNICASTIPADDRESS_TABLE .

Las entradas de dirección IP de unidifusión se devuelven en una estructura de MIB_UNICASTIPADDRESS_TABLE en el búfer al que apunta el parámetro Table . La estructura MIB_UNICASTIPADDRESS_TABLE contiene un recuento de entradas de dirección IP de unidifusión y una matriz de estructuras de MIB_UNICASTIPADDRESS_ROW para cada entrada de dirección IP de unidifusión. Cuando estas estructuras devueltas ya no son necesarias, libere la memoria llamando a FreeMibTable.

El parámetro Family debe inicializarse en AF_INET, AF_INET6 o AF_UNSPEC.

Tenga en cuenta que la estructura de MIB_UNICASTIPADDRESS_TABLE devuelta a la que apunta el parámetro Table puede contener relleno para la alineación entre el miembro NumEntries y la primera entrada de matriz MIB_UNICASTIPADDRESS_ROW en el miembro Table de la estructura MIB_UNICASTIPADDRESS_TABLE . El relleno para la alineación también puede estar presente entre las entradas de matriz de MIB_UNICASTIPADDRESS_ROW . Cualquier acceso a una entrada de matriz de MIB_UNICASTIPADDRESS_ROW debe suponer que puede existir relleno.

Ejemplos

En el ejemplo siguiente se recupera una tabla de direcciones IP de unidifusión e 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

   
Cliente mínimo compatible Windows Vista [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2008 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado netioapi.h (include Iphlpapi.h)
Library Iphlpapi.lib
Archivo DLL Iphlpapi.dll

Consulte también

CreateUnicastIpAddressEntry

DeleteUnicastIpAddressEntry

FreeMibTable

GetUnicastIpAddressEntry

Referencia de la función auxiliar de IP

InitializeUnicastIpAddressEntry

MIB_UNICASTIPADDRESS_ROW

MIB_UNICASTIPADDRESS_TABLE

NotifyStableUnicastIpAddressTable

NotifyUnicastIpAddressChange

SetUnicastIpAddressEntry