EnumProtocolsA 関数 (nspapi.h)

EnumProtocols 関数は、ローカル ホストでアクティブなネットワーク プロトコルの指定されたセットに関する情報を取得します。

メモEnumProtocols 関数は、Windows Sockets 1.1 仕様に対する Microsoft 固有の拡張機能です。 この関数は、現在使用されていません。 Windows Sockets 1.1 開発者の便宜のために、リファレンス 資料が含まれています。 WSAEnumProtocols 関数は、Windows ソケット 2 で同等の機能を提供します。
 

構文

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

パラメーター

[in, optional] lpiProtocols

プロトコル識別子の null で終わる配列へのポインター。 EnumProtocols 関数は、この配列で指定されたプロトコルに関する情報を取得します。

lpiProtocolsNULL の場合、関数は使用可能なすべてのプロトコルに関する情報を取得します。

次のプロトコル識別子の値が定義されています。

意味
IPPROTO_TCP
接続指向ストリーム プロトコルである伝送制御プロトコル (TCP)。
IPPROTO_UDP
コネクションレス データグラム プロトコルであるユーザー データグラム プロトコル (UDP)。
ISOPROTO_TP4
ISO 接続指向トランスポート プロトコル。
NSPROTO_IPX
インターネット パケット交換 (IPX) プロトコル。コネクションレス データグラム プロトコル。
NSPROTO_SPX
接続指向ストリーム プロトコルであるシーケンスド パケット交換 (SPX) プロトコル。
NSPROTO_SPXII
接続指向ストリーム プロトコルである Sequenced Packet Exchange (SPX) プロトコル バージョン 2。

[out] lpProtocolBuffer

関数 がPROTOCOL_INFOデータ 構造の配列で埋めるバッファーへのポインター。

[in, out] lpdwBufferLength

入力時に lpProtocolBuffer が指すバッファーのサイズをバイト単位で指定する変数へのポインター。

出力時に、関数は要求されたすべての情報を取得するために必要な最小バッファー サイズにこの変数を設定します。 関数を成功させるには、バッファーが少なくともこのサイズである必要があります。

戻り値

関数が成功した場合、戻り値は lpProtocolBuffer が指すバッファーに書き込まれたPROTOCOL_INFOデータ構造の数です。

関数が失敗した場合、戻り値は 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 をエイリアスとして定義します。このエイリアスは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー nspapi.h
Library Mswsock.lib
[DLL] Mswsock.dll

こちらもご覧ください

GetAddressByName

PROTOCOL_INFO

Winsock 関数

Winsock リファレンス