Поделиться через


Функция EnumProtocolsA (nspapi.h)

Функция en EnumProtocols извлекает сведения о указанном наборе сетевых протоколов, активных на локальном узле.

Примечание Функция enumProtocols — это расширение, определенное корпорацией Майкрософт, для спецификации Сокетов Windows 1.1. Эта функция устарела. Для удобства разработчиков Сокетов Windows 1.1 содержится справочный материал. Функция WSAEnumProtocols предоставляет эквивалентные функции в Сокетах Windows 2.
 

Синтаксис

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

Параметры

[in, optional] lpiProtocols

Указатель на null-завершенный массив идентификаторов протокола. Функция en EnumProtocols извлекает сведения о протоколах, указанных этим массивом.

Если lpiProtocolsNULL, функция получает сведения обо всех доступных протоколах.

Определены следующие значения идентификатора протокола.

Ценность Значение
IPPROTO_TCP
Протокол управления передачей (TCP), протокол потока, ориентированный на подключение.
IPPROTO_UDP
Протокол пользовательской диаграммы данных (UDP) — протокол без подключения.
ISOPROTO_TP4
Протокол транспорта, ориентированный на iso.
NSPROTO_IPX
Протокол обмена ipx-сообщениями ( IPX) — протокол без подключения.
NSPROTO_SPX
Протокол обмена последовательностьм пакетов (SPX) — протокол потока, ориентированный на подключение.
NSPROTO_SPXII
Протокол s sequenced Packet Exchange (SPX) версии 2— протокол потоковой передачи, ориентированный на подключение.

[out] lpProtocolBuffer

Указатель на буфер, который функция заполняет массивом PROTOCOL_INFO структур данных.

[in, out] lpdwBufferLength

Указатель на переменную, указывающую размер буфера в байтах, на который указывает lpProtocolBuffer.

В выходных данных функция задает эту переменную минимальному размеру буфера, необходимому для получения всех запрошенных сведений. Для успешной работы функции буфер должен иметь по крайней мере этот размер.

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение — это число структур данных PROTOCOL_INFO, записанных в буфер, на который указывает lpProtocolBuffer.

Если функция завершается ошибкой, возвращаемое значение равно SOCKET_ERROR(–1). Чтобы получить расширенные сведения об ошибке, вызовите GetLastError, который возвращает следующий расширенный код ошибки.

Код ошибки Значение
ERROR_INSUFFICIENT_BUFFER
Буфер, на который указывает lpProtocolBuffer, слишком мал, чтобы получить все соответствующие структуры PROTOCOL_INFO. Вызовите функцию с буфером по крайней мере размером, как значение, возвращаемое в *lpdwBufferLength.

Замечания

В следующем примере кода функция enumProtocols извлекает сведения обо всех протоколах, доступных в системе. Затем код изучает каждый из протоколов более подробно.

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

Заметка

Заголовок nspapi.h определяет EnumProtocols как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000 Профессиональный [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
целевая платформа Виндоус
заголовка nspapi.h
библиотеки Mswsock.lib
DLL Mswsock.dll

См. также

GetAddressByName

PROTOCOL_INFO

Функции Winsock

Справочник Winsock