Funzione EnumProtocolsA (nspapi.h)

La funzione EnumProtocols recupera informazioni su un set specificato di protocolli di rete attivi in un host locale.

Nota La funzione EnumProtocols è un'estensione specifica di Microsoft alla specifica Windows Sockets 1.1. questa funzione è obsoleta. Per praticità degli sviluppatori Windows Sockets 1.1, è incluso il materiale di riferimento. La funzione WSAEnumProtocols fornisce funzionalità equivalenti in Windows Sockets 2.
 

Sintassi

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

Parametri

[in, optional] lpiProtocols

Puntatore a una matrice di identificatori di protocollo con terminazione Null. La funzione EnumProtocols recupera informazioni sui protocolli specificati da questa matrice.

Se lpiProtocols è NULL, la funzione recupera informazioni su tutti i protocolli disponibili.

Vengono definiti i valori dell'identificatore di protocollo seguenti.

Valore Significato
IPPROTO_TCP
Tcp (Transmission Control Protocol), un protocollo di flusso orientato alla connessione.
IPPROTO_UDP
Protocollo UDP (User Datagram Protocol), un protocollo di datagrammi senza connessione.
ISOPROTO_TP4
Protocollo di trasporto orientato alla connessione ISO.
NSPROTO_IPX
Protocollo IPX (Internet Packet Exchange), un protocollo datagram senza connessione.
NSPROTO_SPX
Protocollo SPX (Sequenced Packet Exchange), un protocollo di flusso orientato alla connessione.
NSPROTO_SPXII
Protocollo SPX (Sequenced Packet Exchange) versione 2, un protocollo di flusso orientato alla connessione.

[out] lpProtocolBuffer

Puntatore a un buffer che la funzione riempie con una matrice di PROTOCOL_INFO strutture di dati.

[in, out] lpdwBufferLength

Puntatore a una variabile che, all'input, specifica le dimensioni, in byte, del buffer a cui punta lpProtocolBuffer.

Nell'output, la funzione imposta questa variabile sulla dimensione minima del buffer necessaria per recuperare tutte le informazioni richieste. Affinché la funzione abbia esito positivo, il buffer deve avere almeno questa dimensione.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è il numero di PROTOCOL_INFO strutture di dati scritte nel buffer a cui punta lpProtocolBuffer.

Se la funzione ha esito negativo, il valore restituito è SOCKET_ERROR(-1). Per ottenere informazioni sull'errore estese, chiamare GetLastError, che restituisce il codice di errore esteso seguente.

Codice di errore Significato
ERROR_INSUFFICIENT_BUFFER
Il buffer a cui punta lpProtocolBuffer era troppo piccolo per ricevere tutte le strutture PROTOCOL_INFO pertinenti. Chiamare la funzione con un buffer pari almeno al valore restituito in *lpdwBufferLength.

Commenti

Nel codice di esempio seguente la funzione EnumProtocols recupera informazioni su tutti i protocolli disponibili in un sistema. Il codice esamina quindi in modo più dettagliato ognuno dei protocolli.

#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

L'intestazione nspapi.h definisce EnumProtocols come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice che non è indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzioni.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione nspapi.h
Libreria Mswsock.lib
DLL Mswsock.dll

Vedi anche

GetAddressByName

PROTOCOL_INFO

Funzioni Winsock

Informazioni di riferimento su Winsock