Condividi tramite


Funzione GetIpNetTable2 (netioapi.h)

La funzione GetIpNetTable2 recupera la tabella adiacente IP nel computer locale.

Sintassi

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpNetTable2(
  [in]  ADDRESS_FAMILY    Family,
  [out] PMIB_IPNET_TABLE2 *Table
);

Parametri

[in] Family

Famiglia di indirizzi da recuperare.

I valori possibili per la famiglia di indirizzi sono elencati nel file di intestazione Winsock2.h . Si noti che i valori per la famiglia di indirizzi AF_ e le costanti della famiglia di protocolli PF_ sono identiche (ad esempio, AF_INET e PF_INET), in modo che sia possibile usare entrambe le costanti.

Nella Windows SDK rilasciata per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata e i valori possibili per questo membro sono definiti nel file di intestazione Ws2def.h. Si noti che il file di intestazione Ws2def.h viene automaticamente incluso in Winsock2.h e non deve mai essere usato direttamente.

I valori attualmente supportati sono AF_INET, AF_INET6 e AF_UNSPEC.

Valore Significato
AF_UNSPEC
0
La famiglia di indirizzi non è specificata. Quando questo parametro viene specificato, questa funzione restituisce la tabella di indirizzi IP adiacenti contenente sia le voci IPv4 che IPv6.
AF_INET
2
Famiglia di indirizzi IPv4 (Internet Protocol versione 4). Quando questo parametro viene specificato, questa funzione restituisce la tabella di indirizzi IP adiacenti contenente solo le voci IPv4.
AF_INET6
23
Famiglia di indirizzi IPv6 (Internet Protocol versione 6). Quando questo parametro viene specificato, questa funzione restituisce la tabella di indirizzi IP adiacenti contenente solo le voci IPv6.

[out] Table

Puntatore a una struttura MIB_IPNET_TABLE2 che contiene una tabella di voci di indirizzi IP adiacenti nel computer locale.

Valore restituito

Se la funzione ha esito positivo, il valore restituito viene NO_ERROR o ERROR_NOT_FOUND.

Se la funzione ha esito negativo o non restituisce dati, il valore restituito è uno dei codici di errore seguenti.

Codice restituito Descrizione
ERROR_INVALID_PARAMETER
Alla funzione è stato passato un parametro non valido. Questo errore viene restituito se un puntatore NULL viene passato nel parametro Table o se il parametro Family non è stato specificato come AF_INET, AF_INET6 o AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Per completare l'operazione sono disponibili risorse di memoria insufficienti.
ERROR_NOT_FOUND
Non sono state trovate voci di indirizzo IP adiacenti come specificato nel parametro Family .

Questo valore restituito indica che la chiamata alla funzione GetIpNetTable2 è riuscita, ma non sono stati restituiti dati. Ciò può verificarsi quando AF_INET viene specificato nel parametro Family e non sono presenti voci ARP da restituire.

ERROR_NOT_SUPPORTED
La richiesta non è supportata.

Questo errore viene restituito se non si trova alcun stack IPv4 nel computer locale e AF_INET è stato specificato nel parametro Family . Questo errore viene restituito anche se non si trova alcun stack IPv6 nel computer locale e AF_INET6 è stato specificato nel parametro Family . Questo errore viene restituito anche nelle versioni di Windows in cui questa funzione non è supportata.

Altri
Usare FormatMessage per ottenere la stringa del messaggio per l'errore restituito.

Commenti

La funzione GetIpNetTable2 viene definita in Windows Vista e versioni successive.

The
La funzione GetIpNetTable2 enumera gli indirizzi IP adiacenti in un sistema locale e restituisce queste informazioni in una struttura MIB_IPNET_TABLE2 .

Le voci degli indirizzi IP adiacenti vengono restituite in una struttura MIB_IPNET_TABLE2 nel buffer a cui punta il parametro Table . La struttura MIB_IPNET_TABLE2 contiene un numero di voci di indirizzi IP adiacenti e una matrice di strutture MIB_IPNET_ROW2 per ogni voce di indirizzo IP adiacente. Quando queste strutture restituite non sono più necessarie, liberare la memoria chiamando FreeMibTable.

Il parametro Family deve essere inizializzato in AF_INET, AF_INET6 o AF_UNSPEC.

Si noti che la struttura restituita MIB_IPNET_TABLE2 a cui punta il parametro Table può contenere spaziatura interna per l'allineamento tra il membro NumEntries e la prima voce di matrice MIB_IPNET_ROW2 nel membro Table della struttura MIB_IPNET_TABLE2 . La spaziatura interna per l'allineamento può essere presente anche tra le voci della matrice MIB_IPNET_ROW2 . Qualsiasi accesso a una voce di matrice MIB_IPNET_ROW2 deve presupporre che la spaziatura interna possa esistere.

Esempio

Nell'esempio seguente viene recuperata la tabella ip adiacente, quindi vengono stampati i valori per le voci di riga adiacenti IP nella tabella.

#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);
}


Requisiti

Requisito Valore
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione netioapi.h (include Iphlpapi.h)
Libreria Iphlpapi.lib
DLL Iphlpapi.dll

Vedi anche

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2