Partager via


GetIpNetTable2, fonction (netioapi.h)

La fonction GetIpNetTable2 récupère la table IP voisine sur l’ordinateur local.

Syntaxe

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

Paramètres

[in] Family

Famille d’adresses à récupérer.

Les valeurs possibles pour la famille d’adresses sont répertoriées dans le fichier d’en-tête Winsock2.h . Notez que les valeurs de la famille d’adresses AF_ et des constantes de famille de protocole PF_ sont identiques (par exemple , AF_INET et PF_INET), de sorte que l’une ou l’autre constante peut être utilisée.

Sur le SDK Windows publié pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé et les valeurs possibles pour ce membre sont définies dans le fichier d’en-tête Ws2def.h. Notez que le fichier d’en-tête Ws2def.h est automatiquement inclus dans Winsock2.h et ne doit jamais être utilisé directement.

Les valeurs actuellement prises en charge sont AF_INET, AF_INET6 et AF_UNSPEC.

Valeur Signification
AF_UNSPEC
0
La famille d’adresses n’est pas spécifiée. Lorsque ce paramètre est spécifié, cette fonction retourne la table d’adresses IP voisine contenant les entrées IPv4 et IPv6.
AF_INET
2
Famille d’adresses IPv4 (Internet Protocol version 4). Lorsque ce paramètre est spécifié, cette fonction retourne la table d’adresses IP voisine contenant uniquement des entrées IPv4.
AF_INET6
23
Famille d’adresses IPv6 (Internet Protocol version 6). Lorsque ce paramètre est spécifié, cette fonction retourne la table d’adresses IP voisine contenant uniquement des entrées IPv6.

[out] Table

Pointeur vers une structure MIB_IPNET_TABLE2 qui contient une table d’entrées d’adresses IP voisines sur l’ordinateur local.

Valeur retournée

Si la fonction réussit, la valeur de retour est NO_ERROR ou ERROR_NOT_FOUND.

Si la fonction échoue ou ne retourne aucune donnée, la valeur de retour est l’un des codes d’erreur suivants.

Code de retour Description
ERROR_INVALID_PARAMETER
Un paramètre non valide a été transmis à la fonction. Cette erreur est retournée si un pointeur NULL est passé dans le paramètre Table ou si le paramètre Family n’a pas été spécifié comme AF_INET, AF_INET6 ou AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Les ressources de mémoire sont insuffisantes pour terminer l’opération.
ERROR_NOT_FOUND
Aucune entrée d’adresse IP voisine spécifiée dans le paramètre Family n’a été trouvée.

Cette valeur de retour indique que l’appel à la fonction GetIpNetTable2 a réussi, mais qu’il n’y avait aucune donnée à retourner. Cela peut se produire lorsque AF_INET est spécifié dans le paramètre Family et qu’il n’y a aucune entrée ARP à retourner.

ERROR_NOT_SUPPORTED
La demande n'est pas prise en charge.

Cette erreur est retournée si aucune pile IPv4 ne se trouve sur l’ordinateur local et si AF_INET a été spécifié dans le paramètre Family . Cette erreur est également retournée si aucune pile IPv6 n’est sur l’ordinateur local et AF_INET6 a été spécifié dans le paramètre Family . Cette erreur est également retournée sur les versions de Windows où cette fonction n’est pas prise en charge.

Autres
Utilisez FormatMessage pour obtenir la chaîne de message de l’erreur retournée.

Remarques

La fonction GetIpNetTable2 est définie sur Windows Vista et versions ultérieures.

The
La fonction GetIpNetTable2 énumère les adresses IP voisines sur un système local et retourne ces informations dans une structure de MIB_IPNET_TABLE2 .

Les entrées d’adresse IP voisines sont retournées dans une structure MIB_IPNET_TABLE2 dans la mémoire tampon vers laquelle pointe le paramètre Table . La structure MIB_IPNET_TABLE2 contient un nombre d’entrées d’adresses IP voisines et un tableau de structures MIB_IPNET_ROW2 pour chaque entrée d’adresse IP voisine. Lorsque ces structures retournées ne sont plus nécessaires, libérez la mémoire en appelant FreeMibTable.

Le paramètre Family doit être initialisé sur AF_INET, AF_INET6 ou AF_UNSPEC.

Notez que la structure de MIB_IPNET_TABLE2 retournée pointée par le paramètre Table peut contenir un remplissage pour l’alignement entre le membre NumEntries et la première entrée de tableau MIB_IPNET_ROW2 dans le membre Table de la structure MIB_IPNET_TABLE2 . Un remplissage pour l’alignement peut également être présent entre les entrées de tableau MIB_IPNET_ROW2 . Tout accès à une entrée de tableau MIB_IPNET_ROW2 doit supposer qu’un remplissage peut exister.

Exemples

L’exemple suivant récupère la table IP neighbor, puis imprime les valeurs des entrées de ligne du voisin IP dans la table.

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


Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête netioapi.h (include Iphlpapi.h)
Bibliothèque Iphlpapi.lib
DLL Iphlpapi.dll

Voir aussi

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2