Función GetIpNetTable2 (netioapi.h)

La función GetIpNetTable2 recupera la tabla de vecinos de IP en el equipo local.

Sintaxis

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpNetTable2(
  [in]  ADDRESS_FAMILY    Family,
  [out] PMIB_IPNET_TABLE2 *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énticos (por ejemplo, AF_INET y PF_INET), por lo que se puede usar cualquier constante.

En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de los 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
La familia de direcciones no está especificada. Cuando se especifica este parámetro, esta función devuelve la tabla de direcciones IP vecinas 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 vecinas 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 vecinas que contiene solo entradas IPv6.

[out] Table

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

Valor devuelto

Si la función se realiza correctamente, el valor devuelto se NO_ERROR o ERROR_NOT_FOUND.

Si se produce un error en la función o no devuelve datos, 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
Hay recursos de memoria insuficientes disponibles para completar la operación.
ERROR_NOT_FOUND
No se encontraron entradas de dirección IP vecinas como se especifica en el parámetro Family .

Este valor devuelto indica que la llamada a la función GetIpNetTable2 se realizó correctamente, pero no había datos que devolver. Esto puede ocurrir cuando se especifica AF_INET en el parámetro Family y no hay entradas ARP que se devuelvan.

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 del error devuelto.

Comentarios

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

The
La función GetIpNetTable2 enumera las direcciones IP vecinas de un sistema local y devuelve esta información en una estructura MIB_IPNET_TABLE2 .

Las entradas de dirección IP vecina se devuelven en una estructura de MIB_IPNET_TABLE2 en el búfer al que apunta el parámetro Table . La estructura de MIB_IPNET_TABLE2 contiene un recuento de entradas de direcciones IP vecinas y una matriz de estructuras de MIB_IPNET_ROW2 para cada entrada de dirección IP vecina. 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_IPNET_TABLE2 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_IPNET_ROW2 en el miembro Table de la estructura MIB_IPNET_TABLE2 . El relleno para la alineación también puede estar presente entre las entradas de matriz de MIB_IPNET_ROW2 . Cualquier acceso a una entrada de matriz de MIB_IPNET_ROW2 debe suponer que puede existir relleno.

Ejemplos

En el ejemplo siguiente se recupera la tabla de vecinos ip y, a continuación, se imprimen los valores de las entradas de fila de vecino ip de la tabla.

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

int main()
{

    // Declare and initialize variables

    int i;
    unsigned int j;
    unsigned long status = 0;

    PMIB_IPNET_TABLE2 pipTable = NULL;
//    MIB_IPNET_ROW2 ipRow;

    status = GetIpNetTable2(AF_INET, &pipTable);
    if (status != NO_ERROR) {
        printf("GetIpNetTable for IPv4 table returned error: %ld\n", status);
        exit(1);
    }
    // Print some variables from the table
    printf("Number of IPv4 table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; (unsigned) i < pipTable->NumEntries; i++) {
//        printf("Table entry: %d\n", i);
        printf("IPv4 Address[%d]:\t %s\n", (int) i,
               inet_ntoa(pipTable->Table[i].Address.Ipv4.sin_addr));
        printf("Interface index[%d]:\t\t %lu\n", (int) i,
               pipTable->Table[i].InterfaceIndex);

        printf("Interface LUID NetLuidIndex[%d]:\t %lu\n",
               (int) i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);
        printf("Interface LUID IfType[%d]: ", (int) i);
        switch (pipTable->Table[i].InterfaceLuid.Info.IfType) {
        case IF_TYPE_OTHER:
            printf("Other\n");
            break;
        case IF_TYPE_ETHERNET_CSMACD:
            printf("Ethernet\n");
            break;
        case IF_TYPE_ISO88025_TOKENRING:
            printf("Token ring\n");
            break;
        case IF_TYPE_PPP:
            printf("PPP\n");
            break;
        case IF_TYPE_SOFTWARE_LOOPBACK:
            printf("Software loopback\n");
            break;
        case IF_TYPE_ATM:
            printf("ATM\n");
            break;
        case IF_TYPE_IEEE80211:
            printf("802.11 wireless\n");
            break;
        case IF_TYPE_TUNNEL:
            printf("Tunnel encapsulation\n");
            break;
        case IF_TYPE_IEEE1394:
            printf("IEEE 1394 (Firewire)\n");
            break;
        default:
            printf("Unknown: %d\n",
                   pipTable->Table[i].InterfaceLuid.Info.IfType);
            break;
        }

        printf("Physical Address[%d]:\t ", (int) i);
        if (pipTable->Table[i].PhysicalAddressLength == 0)
            printf("\n");
//        for (j = 0; (unsigned) j < pipTable->Table[i].PhysicalAddressLength; j++)
//         printf ("%c" 
        for (j = 0; j < pipTable->Table[i].PhysicalAddressLength; j++) {
            if (j == (pipTable->Table[i].PhysicalAddressLength - 1))
                printf("%.2X\n", (int) pipTable->Table[i].PhysicalAddress[j]);
            else
                printf("%.2X-", (int) pipTable->Table[i].PhysicalAddress[j]);
        }

        printf("Physical Address Length[%d]:\t %lu\n", (int) i,
               pipTable->Table[i].PhysicalAddressLength);

        printf("Neighbor State[%d]:\t ", (int) i);
        switch (pipTable->Table[i].State) {
        case NlnsUnreachable:
            printf("NlnsUnreachable\n");
            break;
        case NlnsIncomplete:
            printf("NlnsIncomplete\n");
            break;
        case NlnsProbe:
            printf("NlnsProbe\n");
            break;
        case NlnsDelay:
            printf("NlnsDelay\n");
            break;
        case NlnsStale:
            printf("NlnsStale\n");
            break;
        case NlnsReachable:
            printf("NlnsReachable\n");
            break;
        case NlnsPermanent:
            printf("NlnsPermanent\n");
            break;
        default:
            printf("Unknown: %d\n", pipTable->Table[i].State);
            break;
        }

        printf("Flags[%d]:\t\t %u\n", (int) i,
               (unsigned char) pipTable->Table[i].Flags);

        printf("ReachabilityTime[%d]:\t %lu\n\n", (int) i,
               pipTable->Table[i].ReachabilityTime);

    }
    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]
Plataforma de destino Windows
Encabezado netioapi.h (incluya Iphlpapi.h)
Library Iphlpapi.lib
Archivo DLL Iphlpapi.dll

Consulte también

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2