Partager via


Fonction EnumProtocolsA (nspapi.h)

La fonction EnumProtocols récupère des informations sur un ensemble spécifié de protocoles réseau actifs sur un hôte local.

Note La fonction EnumProtocols est une extension propre à Microsoft à la spécification Windows Sockets 1.1. Cette fonction est obsolète. Pour la commodité des développeurs Windows Sockets 1.1, le matériel de référence est inclus. La fonction WSAEnumProtocols fournit des fonctionnalités équivalentes dans les sockets Windows 2.
 

Syntaxe

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

Paramètres

[in, optional] lpiProtocols

Pointeur vers un tableau d’identificateurs de protocole terminé par null. La fonction EnumProtocols récupère des informations sur les protocoles spécifiés par ce tableau.

Si lpiProtocols a la valeur NULL, la fonction récupère des informations sur tous les protocoles disponibles.

Les valeurs d’identificateur de protocole suivantes sont définies.

Valeur Signification
IPPROTO_TCP
Tcp (Transmission Control Protocol), un protocole de flux orienté connexion.
IPPROTO_UDP
Protocole UDP (User Datagram Protocol), un protocole de datagramme sans connexion.
ISOPROTO_TP4
Protocole de transport orienté connexion ISO.
NSPROTO_IPX
Protocole IPX (Internet Packet Exchange), un protocole de datagramme sans connexion.
NSPROTO_SPX
Protocole SPX (Sequenced Packet Exchange), un protocole de flux orienté connexion.
NSPROTO_SPXII
Le protocole SPX (Sequenced Packet Exchange) version 2, un protocole de flux orienté connexion.

[out] lpProtocolBuffer

Pointeur vers une mémoire tampon que la fonction remplit avec un tableau de structures de données PROTOCOL_INFO .

[in, out] lpdwBufferLength

Pointeur vers une variable qui, en entrée, spécifie la taille, en octets, de la mémoire tampon pointée par lpProtocolBuffer.

Sur la sortie, la fonction définit cette variable sur la taille de mémoire tampon minimale nécessaire pour récupérer toutes les informations demandées. Pour que la fonction réussisse, la mémoire tampon doit avoir au moins cette taille.

Valeur retournée

Si la fonction réussit, la valeur de retour correspond au nombre de structures de données PROTOCOL_INFO écrites dans la mémoire tampon pointée par lpProtocolBuffer.

Si la fonction échoue, la valeur de retour est SOCKET_ERROR(–1). Pour obtenir des informations d’erreur étendues, appelez GetLastError, qui retourne le code d’erreur étendu suivant.

Code d'erreur Signification
ERROR_INSUFFICIENT_BUFFER
La mémoire tampon pointée par lpProtocolBuffer était trop petite pour recevoir toutes les structures PROTOCOL_INFO pertinentes. Appelez la fonction avec une mémoire tampon au moins aussi grande que la valeur retournée dans *lpdwBufferLength.

Remarques

Dans l’exemple de code suivant, la fonction EnumProtocols récupère des informations sur tous les protocoles disponibles sur un système. Le code examine ensuite chacun des protocoles plus en détail.

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

Notes

L’en-tête nspapi.h définit EnumProtocols comme un alias qui sélectionne automatiquement la version ANSI ou Unicode de cette fonction en fonction de la définition de la constante de préprocesseur UNICODE. Le mélange de l’utilisation de l’alias neutre en encodage avec du code qui n’est pas neutre en encodage peut entraîner des incompatibilités qui entraînent des erreurs de compilation ou d’exécution. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.

Configuration requise

Condition requise Valeur
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 nspapi.h
Bibliothèque Mswsock.lib
DLL Mswsock.dll

Voir aussi

GetAddressByName

PROTOCOL_INFO

Fonctions Winsock

Informations de référence sur Winsock