Función EnumProtocolsA (nspapi.h)

La función EnumProtocols recupera información sobre un conjunto especificado de protocolos de red que están activos en un host local.

Nota La función EnumProtocols es una extensión específica de Microsoft para la especificación de Windows Sockets 1.1. Esta función está obsoleta. Para mayor comodidad de los desarrolladores de Windows Sockets 1.1, se incluye el material de referencia. La función WSAEnumProtocols proporciona una funcionalidad equivalente en Windows Sockets 2.
 

Sintaxis

INT EnumProtocolsA(
  [in, optional] LPINT   lpiProtocols,
  [out]          LPVOID  lpProtocolBuffer,
  [in, out]      LPDWORD lpdwBufferLength
);

Parámetros

[in, optional] lpiProtocols

Puntero a una matriz terminada en null de identificadores de protocolo. La función EnumProtocols recupera información sobre los protocolos especificados por esta matriz.

Si lpiProtocols es NULL, la función recupera información sobre todos los protocolos disponibles.

Se definen los siguientes valores de identificador de protocolo.

Valor Significado
IPPROTO_TCP
El Protocolo de control de transmisión (TCP), un protocolo de flujo orientado a la conexión.
IPPROTO_UDP
El Protocolo de datagramas de usuario (UDP), un protocolo de datagrama sin conexión.
ISOPROTO_TP4
Protocolo de transporte orientado a la conexión ISO.
NSPROTO_IPX
El protocolo Intercambio de paquetes de Internet (IPX), un protocolo de datagramas sin conexión.
NSPROTO_SPX
El protocolo Intercambio de paquetes secuenciados (SPX), un protocolo de flujo orientado a la conexión.
NSPROTO_SPXII
El protocolo Sequenced Packet Exchange (SPX) versión 2, un protocolo de flujo orientado a la conexión.

[out] lpProtocolBuffer

Puntero a un búfer que la función rellena con una matriz de PROTOCOL_INFO estructuras de datos.

[in, out] lpdwBufferLength

Puntero a una variable que, en la entrada, especifica el tamaño, en bytes, del búfer al que apunta lpProtocolBuffer.

En la salida, la función establece esta variable en el tamaño mínimo del búfer necesario para recuperar toda la información solicitada. Para que la función se realice correctamente, el búfer debe tener al menos este tamaño.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es el número de PROTOCOL_INFO estructuras de datos escritas en el búfer a las que apunta lpProtocolBuffer.

Si se produce un error en la función, el valor devuelto es SOCKET_ERROR(–1). Para obtener información de error extendida, llame a GetLastError, que devuelve el siguiente código de error extendido.

Código de error Significado
ERROR_INSUFFICIENT_BUFFER
El búfer al que apunta lpProtocolBuffer era demasiado pequeño para recibir todas las estructuras PROTOCOL_INFO pertinentes. Llame a la función con un búfer al menos tan grande como el valor devuelto en *lpdwBufferLength.

Comentarios

En el código de ejemplo siguiente, la función EnumProtocols recupera información sobre todos los protocolos disponibles en un sistema. A continuación, el código examina cada uno de los protocolos con mayor detalle.

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Nspapi.h>
#include <stdlib.h>
#include <stdio.h>


// Need to link with Ws2_32.lib and Mswsock.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")

int FindProtocol(BOOL Reliable, 
    BOOL MessageOriented, BOOL StreamOriented, 
    BOOL Connectionless, DWORD *ProtocolUsed); 

int __cdecl main(int argc, char **argv)
{
    WSADATA wsaData;

    int ProtocolError = SOCKET_ERROR;
    int iResult;
    
    BOOLEAN bReliable = FALSE;
    BOOLEAN bMessageOriented = FALSE;
    BOOLEAN bStreamOriented = TRUE;
    BOOLEAN bConnectionless = FALSE;
    DWORD *pProtocols = NULL;
    
    // Validate the parameters
    if (argc != 2) {
        printf("usage: %s servicename\n", argv[0]);
        return 1;
    }

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }
    
    ProtocolError = FindProtocol( bReliable, bMessageOriented,
        bStreamOriented, bConnectionless, pProtocols);
    if (ProtocolError == SOCKET_ERROR) {
        printf("Unable to find a protocol to support the parameters requested\n");
        return 1;
    }
    
    // Connect to the servicename ...    
    
    return 0;

}

#define MAX_PROTOCOLS 1024

int FindProtocol ( 
    BOOL Reliable, 
    BOOL MessageOriented, 
    BOOL StreamOriented, 
    BOOL Connectionless, 
    DWORD *ProtocolUsed 
    ) 
{ 
    // local variables 
    INT protocols[MAX_PROTOCOLS+1]; 
    BYTE buffer[2048]; 
    DWORD bytesRequired; 
    INT err; 
    PPROTOCOL_INFO protocolInfo; 
    INT protocolCount; 
    INT i; 
    DWORD protocolIndex; 
//    PCSADDR_INFO csaddrInfo; 
//    INT addressCount; 
//    SOCKET s; 
 
    // First look up the protocols installed on this computer. 
    // 
    bytesRequired = sizeof(buffer); 
    err = EnumProtocols( NULL, buffer, &bytesRequired ); 
    if ( err <= 0 ) 
        return SOCKET_ERROR; 
 
    // Walk through the available protocols and pick out the ones which 
    // support the desired characteristics. 
    // 
    protocolCount = err; 
    protocolInfo = (PPROTOCOL_INFO)buffer; 
 
    for ( i = 0, protocolIndex = 0; 
        i < protocolCount && protocolIndex < MAX_PROTOCOLS; 
        i++, protocolInfo++ ) { 
 
        // If connection-oriented support is requested, then check if 
        // supported by this protocol.  We assume here that connection- 
        // oriented support implies fully reliable service. 
        // 
 
        if ( Reliable ) { 
            // Check to see if the protocol is reliable.  It must 
            // guarantee both delivery of all data and the order in 
            // which the data arrives. 
            // 
            if ( (protocolInfo->dwServiceFlags & 
                    XP_GUARANTEED_DELIVERY) == 0 
                || 
                    (protocolInfo->dwServiceFlags & 
                    XP_GUARANTEED_ORDER) == 0 ) { 
 
                continue; 
            } 
 
            // Check to see that the protocol matches the stream/message 
            // characteristics requested. 
            // 
            if ( StreamOriented && 
                (protocolInfo->dwServiceFlags & XP_MESSAGE_ORIENTED) 
                    != 0 && 
                (protocolInfo->dwServiceFlags & XP_PSEUDO_STREAM) 
                     == 0 ) { 
                continue; 
            } 
 
            if ( MessageOriented && 
                    (protocolInfo->dwServiceFlags & XP_MESSAGE_ORIENTED) 
                              == 0 ) { 
                continue; 
            } 
 
        } 
        else if ( Connectionless ) { 
            // Make sure that this is a connectionless protocol. 
            // 
            if ( (protocolInfo->dwServiceFlags & XP_CONNECTIONLESS) 
                     != 0 ) 
                continue; 
        } 
 
        // This protocol fits all the criteria.  Add it to the list of 
        // protocols in which we're interested. 
        // 
        protocols[protocolIndex++] = protocolInfo->iProtocol; 
     }

     *ProtocolUsed = (INT) protocolIndex;
     return 0;
}

Nota

El encabezado nspapi.h define EnumProtocols como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutro de codificación con código que no es neutral de codificación puede provocar discrepancias que dan lugar a errores de compilación o en tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

Requisitos

Requisito Value
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 nspapi.h
Library Mswsock.lib
Archivo DLL Mswsock.dll

Consulte también

GetAddressByName

PROTOCOL_INFO

Funciones winsock

Referencia de Winsock