Condividi tramite


Funzione GetIpNetTable2 (netioapi.h)

La funzione GetIpNetTable2 recupera la tabella ip adiacente 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 di PF_ sono identiche (ad esempio, AF_INET e PF_INET), in modo che sia possibile usare entrambe le costanti.

In Windows SDK rilasciato 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 incluso automaticamente in Winsock2.he non deve mai essere usato direttamente.

I valori attualmente supportati sono AF_INET, AF_INET6e AF_UNSPEC.

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

[out] Table

Puntatore a un 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 il parametro family non è stato specificato come AF_INET, AF_INET6o AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Per completare l'operazione sono disponibili risorse di memoria insufficienti.
ERROR_NOT_FOUND
Nessuna voce di indirizzo IP adiacente come specificato nel parametro famiglia di .

Questo valore restituito indica che la chiamata alla funzione GetIpNetTable2 ha avuto esito positivo, ma non sono stati restituiti dati. Ciò può verificarsi quando AF_INET viene specificato nel parametro famiglia di e non sono presenti voci ARP da restituire.

ERROR_NOT_SUPPORTED
La richiesta non è supportata.

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

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

Osservazioni

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

Le
funzione getIpNetTable2 enumera gli indirizzi IP adiacenti in un sistema locale e restituisce queste informazioni in una struttura MIB_IPNET_TABLE2.

Le voci dell'indirizzo IP adiacente vengono restituite in una struttura di 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 il FreeMibTable.

Il parametro Family deve essere inizializzato in AF_INET, AF_INET6o AF_UNSPEC.

Si noti che la struttura MIB_IPNET_TABLE2 restituita 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 nella 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 esista.

Esempi

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

Fabbisogno

Requisito Valore
client minimo supportato Windows Vista [solo app desktop]
server minimo supportato Windows Server 2008 [solo app desktop]
piattaforma di destinazione Finestre
intestazione netioapi.h (include Iphlpapi.h)
libreria Iphlpapi.lib
dll Iphlpapi.dll

Vedere anche

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2