Share via


Función GetAdaptersInfo (iphlpapi.h)

La función GetAdaptersInfo recupera información del adaptador para el equipo local.

En Windows XP y versiones posteriores: Use la función GetAdaptersAddresses en lugar de GetAdaptersInfo.

Sintaxis

IPHLPAPI_DLL_LINKAGE ULONG GetAdaptersInfo(
  [out]     PIP_ADAPTER_INFO AdapterInfo,
  [in, out] PULONG           SizePointer
);

Parámetros

[out] AdapterInfo

Puntero a un búfer que recibe una lista vinculada de estructuras de IP_ADAPTER_INFO .

[in, out] SizePointer

Puntero a una variable ULONG que especifica el tamaño del búfer al que apunta el parámetro pAdapterInfo . Si este tamaño no es suficiente para contener la información del adaptador, GetAdaptersInfo rellena esta variable con el tamaño necesario y devuelve un código de error de ERROR_BUFFER_OVERFLOW.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto se ERROR_SUCCESS (definido en el mismo valor que 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_BUFFER_OVERFLOW
El búfer para recibir la información del adaptador es demasiado pequeño. Este valor se devuelve si el tamaño del búfer indicado por el parámetro pOutBufLen es demasiado pequeño para contener la información del adaptador o el parámetro pAdapterInfo era un puntero NULL . Cuando se devuelve este código de error, el parámetro pOutBufLen apunta al tamaño de búfer necesario.
ERROR_INVALID_DATA
Se recuperó la información del adaptador no válida.
ERROR_INVALID_PARAMETER
Uno de los parámetros no es válido. Este error se devuelve si el parámetro pOutBufLen es un puntero NULL o el proceso de llamada no tiene acceso de lectura y escritura a la memoria a la que apunta pOutBufLen o el proceso de llamada no tiene acceso de escritura a la memoria a la que apunta el parámetro pAdapterInfo .
ERROR_NO_DATA
No existe información de adaptador para el equipo local.
ERROR_NOT_SUPPORTED
El sistema operativo que se ejecuta en el equipo local no admite la función GetAdaptersInfo .
Otros
Si se produce un error en la función, use FormatMessage para obtener la cadena de mensaje para el error devuelto.

Comentarios

La función GetAdaptersInfo solo puede recuperar información para direcciones IPv4.

En versiones anteriores a Windows 10, el orden en que aparecen los adaptadores en la lista devuelta por esta función se puede controlar desde la carpeta Conexiones de red: seleccione el elemento de menú Configuración avanzada en el menú Opciones avanzadas. A partir de Windows 10, el pedido no se especifica.

Las funciones GetAdaptersInfo y GetInterfaceInfo no devuelven información sobre la interfaz de bucle invertido IPv4. La función GetIpAddrTable devuelve información sobre la interfaz de bucle invertido.

En Windows XP y versiones posteriores: La lista de adaptadores devueltos por GetAdaptersInfo incluye adaptadores unidireccionales. Para generar una lista de adaptadores que pueden enviar y recibir datos, llame a GetUniDirectionalAdapterInfo y excluya los adaptadores devueltos de la lista devuelta por GetAdaptersInfo.

Ejemplos

En este ejemplo se recupera la información del adaptador y se imprimen varias propiedades de cada adaptador.

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "IPHLPAPI.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()
{

    /* Declare and initialize variables */

// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers
// assigned to the adapter. 
//
// Note that this sample code only prints out the 
// first entry for the IP address/mask, and gateway, and
// the primary and secondary WINS server for each adapter. 

    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0;
    UINT i;

/* variables used to print DHCP time info */
    struct tm newtime;
    char buffer[32];
    errno_t error;

    ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfo\n");
        return 1;
    }
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        FREE(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            printf("Error allocating memory needed to call GetAdaptersinfo\n");
            return 1;
        }
    }

    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
        pAdapter = pAdapterInfo;
        while (pAdapter) {
            printf("\tComboIndex: \t%d\n", pAdapter->ComboIndex);
            printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
            printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
            printf("\tAdapter Addr: \t");
            for (i = 0; i < pAdapter->AddressLength; i++) {
                if (i == (pAdapter->AddressLength - 1))
                    printf("%.2X\n", (int) pAdapter->Address[i]);
                else
                    printf("%.2X-", (int) pAdapter->Address[i]);
            }
            printf("\tIndex: \t%d\n", pAdapter->Index);
            printf("\tType: \t");
            switch (pAdapter->Type) {
            case MIB_IF_TYPE_OTHER:
                printf("Other\n");
                break;
            case MIB_IF_TYPE_ETHERNET:
                printf("Ethernet\n");
                break;
            case MIB_IF_TYPE_TOKENRING:
                printf("Token Ring\n");
                break;
            case MIB_IF_TYPE_FDDI:
                printf("FDDI\n");
                break;
            case MIB_IF_TYPE_PPP:
                printf("PPP\n");
                break;
            case MIB_IF_TYPE_LOOPBACK:
                printf("Loopback\n");
                break;
            case MIB_IF_TYPE_SLIP:
                printf("Slip\n");
                break;
            default:
                printf("Unknown type %ld\n", pAdapter->Type);
                break;
            }

            printf("\tIP Address: \t%s\n",
                   pAdapter->IpAddressList.IpAddress.String);
            printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);

            printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
            printf("\t***\n");

            if (pAdapter->DhcpEnabled) {
                printf("\tDHCP Enabled: Yes\n");
                printf("\t  DHCP Server: \t%s\n",
                       pAdapter->DhcpServer.IpAddress.String);

                printf("\t  Lease Obtained: ");
                /* Display local time */
                error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseObtained);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }

                printf("\t  Lease Expires:  ");
                error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseExpires);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }
            } else
                printf("\tDHCP Enabled: No\n");

            if (pAdapter->HaveWins) {
                printf("\tHave Wins: Yes\n");
                printf("\t  Primary Wins Server:    %s\n",
                       pAdapter->PrimaryWinsServer.IpAddress.String);
                printf("\t  Secondary Wins Server:  %s\n",
                       pAdapter->SecondaryWinsServer.IpAddress.String);
            } else
                printf("\tHave Wins: No\n");
            pAdapter = pAdapter->Next;
            printf("\n");
        }
    } else {
        printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);

    }
    if (pAdapterInfo)
        FREE(pAdapterInfo);

    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

GetAdaptersAddresses

GetInterfaceInfo

GetIpAddrTable

GetNumberOfInterfaces

GetUniDirectionalAdapterInfo

Referencia de la función auxiliar de IP

Página de inicio del asistente de IP

IP_ADAPTER_INFO