Función GetIfTable (iphlpapi.h)

La función GetIfTable recupera la tabla de interfaz MIB-II.

Sintaxis

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

Parámetros

[out] pIfTable

Puntero a un búfer que recibe la tabla de interfaz como una estructura MIB_IFTABLE .

[in, out] pdwSize

En la entrada, especifica el tamaño en bytes del búfer al que apunta el parámetro pIfTable .

En la salida, si el búfer no es lo suficientemente grande como para contener la tabla de interfaz devuelta, la función establece este parámetro igual al tamaño de búfer necesario en bytes.

[in] bOrder

Valor booleano que especifica si la tabla de interfaz devuelta debe ordenarse en orden ascendente por índice de interfaz. Si este parámetro es TRUE, la tabla se ordena.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es NO_ERROR.

Si se produce un error en la función, el valor devuelto es uno de los siguientes códigos de error.

Código devuelto Descripción
ERROR_INSUFFICIENT_BUFFER
El búfer al que apunta el parámetro pIfTable no es lo suficientemente grande. El tamaño necesario se devuelve en la variable DWORD a la que apunta el parámetro pdwSize .
ERROR_INVALID_PARAMETER
El parámetro pdwSize es NULL o GetIfTable no puede escribir en la memoria a la que apunta el parámetro pdwSize .
ERROR_NOT_SUPPORTED
Esta función no se admite en el sistema operativo en uso en el sistema local.
Otros
Use la función FormatMessage para obtener la cadena de mensaje del error devuelto.

Comentarios

The
La función GetIfTable enumera interfaces físicas en un sistema local y devuelve esta información en una estructura de MIB_IFTABLE . Las interfaces físicas incluyen la interfaz de bucle invertido de software.

Las funciones GetIfTable2 y GetIfTable2Ex disponibles en Windows Vista y versiones posteriores son una versión mejorada de la función GetIfTable que enumera las interfaces físicas y lógicas en un sistema local. Entre las interfaces lógicas se incluyen varias interfaces WAN Miniport usadas para las encapsulaciones de túnel L2TP, PPTP, PPOE y otras.

Las interfaces se devuelven en una estructura de MIB_IFTABLE en el búfer al que apunta el parámetro pIfTable . La estructura MIB_IFTABLE contiene un recuento de interfaces y una matriz de estructuras de MIB_IFROW para cada interfaz.

Tenga en cuenta que la estructura de MIB_IFTABLE devuelta a la que apunta el parámetro pIfTable puede contener relleno para la alineación entre el miembro dwNumEntries y la primera entrada de matriz MIB_IFROW en el miembro de tabla de la estructura MIB_IFTABLE . El relleno para la alineación también puede estar presente entre las entradas de matriz de MIB_IFROW . Cualquier acceso a una entrada de matriz MIB_IFROW debe suponer que puede existir relleno.

Ejemplos

En el ejemplo siguiente se recupera la tabla de interfaz y se imprime el número de entradas de la tabla y algunos datos de cada entrada.

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


Requisitos

   
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado iphlpapi.h
Library Iphlpapi.lib
Archivo DLL Iphlpapi.dll

Consulte también

GetIfEntry

GetIfEntry2

GetIfTable2

GetIfTable2Ex

GetNumberOfInterfaces

Referencia de la función auxiliar de IP

MIB_IFROW

MIB_IFTABLE

MIB_IF_ROW2

MIB_IF_TABLE2