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.
[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 |
---|---|
|
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. |
|
Hay recursos de memoria insuficientes disponibles para completar la operación. |
|
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. |
|
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. |
|
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 |