Função GetIpNetTable2 (netioapi.h)
A função GetIpNetTable2 recupera a tabela de vizinho ip no computador local.
Sintaxe
IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpNetTable2(
[in] ADDRESS_FAMILY Family,
[out] PMIB_IPNET_TABLE2 *Table
);
Parâmetros
[in] Family
A família de endereços a ser recuperada.
Os valores possíveis para a família de endereços são listados no arquivo de cabeçalho Winsock2.h . Observe que os valores para a família de endereços AF_ e PF_ constantes da família de protocolos são idênticos (por exemplo, AF_INET e PF_INET), portanto, qualquer constante pode ser usada.
Na SDK do Windows lançada para Windows Vista e posterior, a organização dos arquivos de cabeçalho foi alterada e os valores possíveis para esse membro são definidos no arquivo de cabeçalho Ws2def.h. Observe que o arquivo de cabeçalho Ws2def.h é incluído automaticamente no Winsock2.h e nunca deve ser usado diretamente.
Os valores com suporte no momento são AF_INET, AF_INET6 e AF_UNSPEC.
[out] Table
Um ponteiro para uma estrutura MIB_IPNET_TABLE2 que contém uma tabela de entradas de endereço IP vizinho no computador local.
Retornar valor
Se a função for bem-sucedida, o valor retornado será NO_ERROR ou ERROR_NOT_FOUND.
Se a função falhar ou não retornar dados, o valor retornado será um dos códigos de erro a seguir.
Código de retorno | Descrição |
---|---|
|
Um parâmetro inválido foi passado para a função. Esse erro será retornado se um ponteiro NULL for passado no parâmetro Table ou o parâmetro Family não tiver sido especificado como AF_INET, AF_INET6 ou AF_UNSPEC. |
|
Recursos de memória insuficientes estão disponíveis para concluir a operação. |
|
Nenhuma entrada de endereço IP vizinho, conforme especificado no parâmetro Family , foi encontrada.
Esse valor retornado indica que a chamada para a função GetIpNetTable2 foi bem-sucedida, mas não havia dados a serem retornados. Isso pode ocorrer quando AF_INET é especificado no parâmetro Family e não há entradas ARP a serem retornadas. |
|
A solicitação não terá suporte.
Esse erro será retornado se nenhuma pilha IPv4 estiver no computador local e AF_INET tiver sido especificado no parâmetro Family . Esse erro também será retornado se nenhuma pilha IPv6 estiver no computador local e AF_INET6 tiver sido especificado no parâmetro Family . Esse erro também é retornado em versões do Windows em que essa função não tem suporte. |
|
Use FormatMessage para obter a cadeia de caracteres de mensagem para o erro retornado. |
Comentários
A função GetIpNetTable2 é definida no Windows Vista e posterior.
O
A função GetIpNetTable2 enumera os endereços IP vizinhos em um sistema local e retorna essas informações em uma estrutura MIB_IPNET_TABLE2.
As entradas de endereço IP vizinho são retornadas em uma estrutura MIB_IPNET_TABLE2 no buffer apontado pelo parâmetro Table . A estrutura MIB_IPNET_TABLE2 contém uma contagem de entradas de endereço IP vizinho e uma matriz de estruturas de MIB_IPNET_ROW2 para cada entrada de endereço IP vizinho. Quando essas estruturas retornadas não forem mais necessárias, libere a memória chamando FreeMibTable.
O parâmetro Family deve ser inicializado para AF_INET, AF_INET6 ou AF_UNSPEC.
Observe que a estrutura de MIB_IPNET_TABLE2 retornada apontada pelo parâmetro Table pode conter preenchimento para alinhamento entre o membro NumEntries e a primeira entrada de matriz MIB_IPNET_ROW2 no membro Table da estrutura MIB_IPNET_TABLE2 . O preenchimento para alinhamento também pode estar presente entre as entradas da matriz MIB_IPNET_ROW2 . Qualquer acesso a uma entrada de matriz MIB_IPNET_ROW2 deve assumir que o preenchimento pode existir.
Exemplos
O exemplo a seguir recupera a tabela de vizinho ip e imprime os valores para entradas de linha do vizinho IP na tabela.
#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 | Valor |
---|---|
Cliente mínimo com suporte | Windows Vista [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2008 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | netioapi.h (inclua Iphlpapi.h) |
Biblioteca | Iphlpapi.lib |
DLL | Iphlpapi.dll |