Condividi tramite


Funzione GetIfTable (iphlpapi.h)

La funzione GetIfTable recupera la tabella dell'interfaccia MIB-II.

Sintassi

IPHLPAPI_DLL_LINKAGE DWORD GetIfTable(
  [out]     PMIB_IFTABLE pIfTable,
  [in, out] PULONG       pdwSize,
  [in]      BOOL         bOrder
);

Parametri

[out] pIfTable

Puntatore a un buffer che riceve la tabella dell'interfaccia come struttura MIB_IFTABLE .

[in, out] pdwSize

In input, specifica le dimensioni in byte del buffer a cui punta il parametro pIfTable .

Nell'output, se il buffer non è sufficientemente grande da contenere la tabella dell'interfaccia restituita, la funzione imposta questo parametro uguale alle dimensioni del buffer necessarie in byte.

[in] bOrder

Valore booleano che specifica se la tabella dell'interfaccia restituita deve essere ordinata in ordine crescente in base all'indice dell'interfaccia. Se questo parametro è TRUE, la tabella viene ordinata.

Valore restituito

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

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

Codice restituito Descrizione
ERROR_INSUFFICIENT_BUFFER
Il buffer a cui punta il parametro pIfTable non è sufficiente. La dimensione richiesta viene restituita nella variabile DWORD a cui punta il parametro pdwSize .
ERROR_INVALID_PARAMETER
Il parametro pdwSize è NULL oppure GetIfTable non è in grado di scrivere nella memoria a cui punta il parametro pdwSize .
ERROR_NOT_SUPPORTED
Questa funzione non è supportata nel sistema operativo in uso nel sistema locale.
Altri
Utilizzare la funzione FormatMessage per ottenere la stringa di messaggio per l'errore restituito.

Commenti

The
La funzione GetIfTable enumera le interfacce fisiche in un sistema locale e restituisce queste informazioni in una struttura MIB_IFTABLE . Le interfacce fisiche includono l'interfaccia di loopback software.

Le funzioni GetIfTable2 e GetIfTable2Ex disponibili in Windows Vista e versioni successive sono una versione avanzata della funzione GetIfTable che enumera le interfacce fisiche e logiche in un sistema locale. Le interfacce logiche includono varie interfacce Miniport WAN usate per L2TP, PPTP, PPOE e altri incapsulamenti del tunnel.

Le interfacce vengono restituite in una struttura MIB_IFTABLE nel buffer a cui punta il parametro pIfTable . La struttura MIB_IFTABLE contiene un conteggio delle interfacce e una matrice di strutture MIB_IFROW per ogni interfaccia.

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

Esempio

Nell'esempio seguente viene recuperata la tabella dell'interfaccia e viene stampato il numero di voci nella tabella e alcuni dati per ogni voce.

#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "IPHLPAPI.lib")

#include <iphlpapi.h>

#include <stdio.h>
#include <stdlib.h>

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

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

int main()
{

    // Declare and initialize variables.

    DWORD dwSize = 0;
    DWORD dwRetVal = 0;

    unsigned int i, j;

    /* variables used for GetIfTable and GetIfEntry */
    MIB_IFTABLE *pIfTable;
    MIB_IFROW *pIfRow;

    // Allocate memory for our pointers.
    pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
    if (pIfTable == NULL) {
        printf("Error allocating memory needed to call GetIfTable\n");
        return 1;
    }
    // Make an initial call to GetIfTable to get the
    // necessary size into dwSize
    dwSize = sizeof (MIB_IFTABLE);
    if (GetIfTable(pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) {
        FREE(pIfTable);
        pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
        if (pIfTable == NULL) {
            printf("Error allocating memory needed to call GetIfTable\n");
            return 1;
        }
    }
    // Make a second call to GetIfTable to get the actual
    // data we want.
    if ((dwRetVal = GetIfTable(pIfTable, &dwSize, FALSE)) == NO_ERROR) {
        printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries);
        for (i = 0; i < pIfTable->dwNumEntries; i++) {
            pIfRow = (MIB_IFROW *) & pIfTable->table[i];
            printf("\tIndex[%d]:\t %ld\n", i, pIfRow->dwIndex);
            printf("\tInterfaceName[%d]:\t %ws", i, pIfRow->wszName);
            printf("\n");
            printf("\tDescription[%d]:\t ", i);
            for (j = 0; j < pIfRow->dwDescrLen; j++)
                printf("%c", pIfRow->bDescr[j]);
            printf("\n");
            printf("\tType[%d]:\t ", i);
            switch (pIfRow->dwType) {
            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 Lookback\n");
                break;
            case IF_TYPE_ATM:
                printf("ATM\n");
                break;
            case IF_TYPE_IEEE80211:
                printf("IEEE 802.11 Wireless\n");
                break;
            case IF_TYPE_TUNNEL:
                printf("Tunnel type encapsulation\n");
                break;
            case IF_TYPE_IEEE1394:
                printf("IEEE 1394 Firewire\n");
                break;
            default:
                printf("Unknown type %ld\n", pIfRow->dwType);
                break;
            }
            printf("\tMtu[%d]:\t\t %ld\n", i, pIfRow->dwMtu);
            printf("\tSpeed[%d]:\t %ld\n", i, pIfRow->dwSpeed);
            printf("\tPhysical Addr:\t ");
            if (pIfRow->dwPhysAddrLen == 0)
                printf("\n");
            for (j = 0; j < pIfRow->dwPhysAddrLen; j++) {
                if (j == (pIfRow->dwPhysAddrLen - 1))
                    printf("%.2X\n", (int) pIfRow->bPhysAddr[j]);
                else
                    printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
            }
            printf("\tAdmin Status[%d]:\t %ld\n", i, pIfRow->dwAdminStatus);
            printf("\tOper Status[%d]:\t ", i);
            switch (pIfRow->dwOperStatus) {
            case IF_OPER_STATUS_NON_OPERATIONAL:
                printf("Non Operational\n");
                break;
            case IF_OPER_STATUS_UNREACHABLE:
                printf("Unreachable\n");
                break;
            case IF_OPER_STATUS_DISCONNECTED:
                printf("Disconnected\n");
                break;
            case IF_OPER_STATUS_CONNECTING:
                printf("Connecting\n");
                break;
            case IF_OPER_STATUS_CONNECTED:
                printf("Connected\n");
                break;
            case IF_OPER_STATUS_OPERATIONAL:
                printf("Operational\n");
                break;
            default:
                printf("Unknown status %ld\n", pIfRow->dwAdminStatus);
                break;
            }
            printf("\n");
        }
    } else {
        printf("GetIfTable failed with error: \n", dwRetVal);
        if (pIfTable != NULL) {
            FREE(pIfTable);
            pIfTable = NULL;
        }  
        return 1;
        // Here you can use FormatMessage to find out why 
        // it failed.
    }
    if (pIfTable != NULL) {
        FREE(pIfTable);
        pIfTable = NULL;
    }
    return 0;
}


Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione iphlpapi.h
Libreria Iphlpapi.lib
DLL Iphlpapi.dll

Vedi anche

GetIfEntry

GetIfEntry2

GetIfTable2

GetIfTable2Ex

GetNumberOfInterfaces

Informazioni di riferimento sulle funzioni helper IP

MIB_IFROW

MIB_IFTABLE

MIB_IF_ROW2

MIB_IF_TABLE2