GetIpAddrTable, fonction (iphlpapi.h)

La fonction GetIpAddrTable récupère la table de mappage d’adresses interface à IPv4.

Syntaxe

IPHLPAPI_DLL_LINKAGE DWORD GetIpAddrTable(
  [out]     PMIB_IPADDRTABLE pIpAddrTable,
  [in, out] PULONG           pdwSize,
  [in]      BOOL             bOrder
);

Paramètres

[out] pIpAddrTable

Pointeur vers une mémoire tampon qui reçoit la table de mappage d’adresses iPv4 en tant que structure MIB_IPADDRTABLE .

[in, out] pdwSize

Lors de l’entrée, spécifie la taille en octets de la mémoire tampon pointée vers le paramètre pIpAddrTable .

En sortie, si la mémoire tampon n’est pas assez grande pour contenir la table de mappage retournée, la fonction définit ce paramètre comme étant égal à la taille de mémoire tampon requise en octets.

[in] bOrder

Si ce paramètre a la valeur TRUE, la table de mappage retournée est triée dans l’ordre croissant par adresse IPv4. Le tri est effectué dans l’ordre d’octet réseau. Par exemple, 10.0.0.255 arrive immédiatement avant 10.0.1.0.

Valeur retournée

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

Si la fonction échoue, la valeur de retour est l’un des codes d’erreur suivants.

Code de retour Description
ERROR_INSUFFICIENT_BUFFER
La mémoire tampon pointée vers le paramètre pIpAddrTable n’est pas assez grande. La taille requise est retournée dans la variable DWORD pointée vers le paramètre pdwSize .
ERROR_INVALID_PARAMETER
Le paramètre pdwSize a la valeur NULL ou GetIpAddrTable ne peut pas écrire dans la mémoire pointée par le paramètre pdwSize .
ERROR_NOT_SUPPORTED
Cette fonction n’est pas prise en charge sur le système d’exploitation utilisé sur le système local.
Autres
Utilisez FormatMessage pour obtenir la chaîne de message pour l’erreur retournée.

Notes

La fonction GetIpAddrTable récupère la table de mappage d’adresses interface-à-IPv4 sur un ordinateur local et retourne ces informations dans une structure MIB_IPADDRTABLE .

Les adresses IPv4 retournées par la fonction GetIpAddrTable sont affectées par le status des interfaces réseau sur un ordinateur local. La réinitialisation manuelle d’une carte d’interface réseau (NIC) et de certains événements PnP peut entraîner la suppression ou la modification d’une adresse IP.

Sur Windows Server 2003 et Windows XP, les adresses IPv4 retournées par la fonction GetIpAddrTable sont également affectées si la capacité de détection multimédia de la pile TCP/IP sur un ordinateur local a été désactivée en appelant la fonction DisableMediaSense . Lorsque la détection multimédia a été désactivée, la fonction GetIpAddrTable peut retourner des adresses IPv4 associées à des interfaces déconnectées. Ces adresses Ipv4 pour les interfaces déconnectées ne sont pas valides pour une utilisation.

Sur Windows Server 2008 et Windows Vista, les adresses IPv4 retournées par la fonction GetIpAddrTable ne sont pas affectées par la capacité de détection multimédia de la pile TCP/IP sur un ordinateur local. La fonction GetIpAddrTable retourne uniquement les adresses IPv4 valides.

La fonction GetAdaptersAddresses disponible sur Windows XP peut être utilisée pour récupérer à la fois les adresses IPv6 et IPv4 et les informations d’interface.

La structure MIB_IPADDRTABLE retournée par la fonction GetIpAddrTable peut contenir un remplissage pour l’alignement entre le membre dwNumEntries et la première entrée de tableau MIB_IPADDRROW dans le membre de table . Le remplissage pour l’alignement peut également être présent entre les entrées de tableau MIB_IPADDRROW dans le membre de la table . Tout accès à une entrée de tableau MIB_IPADDRROW doit supposer qu’un remplissage peut exister.

Dans le Kit de développement logiciel (SDK) Microsoft Windows publié pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé et le MIB_IPADDRROW est défini dans le fichier d’en-tête Ipmib.h et non dans le fichier d’en-tête Iprtrmib.h. Notez que le fichier d’en-tête Ipmib.h est automatiquement inclus dans Iprtrmib.h , qui est automatiquement inclus dans le fichier d’en-tête Iphlpapi.h . Les fichiers d’en-tête Ipmib.h et Iprtrmib.h ne doivent jamais être utilisés directement.

Exemples

L’exemple suivant récupère la table d’adresses IP, puis imprime certains membres des entrées d’adresse IP dans la table.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

int __cdecl main()
{

    int i;
    
    /* Variables used by GetIpAddrTable */
    PMIB_IPADDRTABLE pIPAddrTable;
    DWORD dwSize = 0;
    DWORD dwRetVal = 0;
    IN_ADDR IPAddr;

    /* Variables used to return error message */
    LPVOID lpMsgBuf;

    // Before calling AddIPAddress we use GetIpAddrTable to get
    // an adapter to which we can add the IP.
    pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));

    if (pIPAddrTable) {
        // Make an initial call to GetIpAddrTable to get the
        // necessary size into the dwSize variable
        if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
            ERROR_INSUFFICIENT_BUFFER) {
            FREE(pIPAddrTable);
            pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);

        }
        if (pIPAddrTable == NULL) {
            printf("Memory allocation failed for GetIpAddrTable\n");
            exit(1);
        }
    }
    // Make a second call to GetIpAddrTable to get the
    // actual data we want
    if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) { 
        printf("GetIpAddrTable failed with error %d\n", dwRetVal);
        if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
                          (LPTSTR) & lpMsgBuf, 0, NULL)) {
            printf("\tError: %s", lpMsgBuf);
            LocalFree(lpMsgBuf);
        }
        exit(1);
    }

    printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
    for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
        printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
        IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
        printf("\tIP Address[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );
        IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
        printf("\tSubnet Mask[%d]:    \t%s\n", i, inet_ntoa(IPAddr) );
        IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
        printf("\tBroadCast[%d]:      \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
        printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
        printf("\tType and State[%d]:", i);
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
            printf("\tPrimary IP Address");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
            printf("\tDynamic IP Address");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
            printf("\tAddress is on disconnected interface");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
            printf("\tAddress is being deleted");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
            printf("\tTransient address");
        printf("\n");
    }

    if (pIPAddrTable) {
        FREE(pIPAddrTable);
        pIPAddrTable = NULL;
    }

    exit(0);
}


Spécifications

   
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête iphlpapi.h
Bibliothèque Iphlpapi.lib
DLL Iphlpapi.dll

Voir aussi

AddIPAddress

DisableMediaSense

GetAdaptersAddresses

Informations de référence sur la fonction d’assistance IP

IP_ADAPTER_ADDRESSES

MIB_IPADDRROW

MIB_IPADDRTABLE

RestoreMediaSense