WSAEnumNameSpaceProvidersA 함수(winsock2.h)

WSAEnumNameSpaceProviders 함수는 사용 가능한 네임스페이스 공급자에 대한 정보를 검색합니다.

구문

INT WSAAPI WSAEnumNameSpaceProvidersA(
  [in, out] LPDWORD              lpdwBufferLength,
  [out]     LPWSANAMESPACE_INFOA lpnspBuffer
);

매개 변수

[in, out] lpdwBufferLength

입력에서 lpnspBuffer가 가리키는 버퍼에 포함된 바이트 수입니다. 출력에서(함수가 실패하고 오류가 WSAEFAULT인 경우) lpnspBuffer 가 요청된 모든 정보를 검색하기 위해 전달할 최소 바이트 수입니다. WSAEnumNameSpaceProviders에 전달된 버퍼는 모든 네임스페이스 정보를 보유하기에 충분해야 합니다.

[out] lpnspBuffer

WSANAMESPACE_INFO 구조체로 채워진 버퍼입니다. 반환된 구조체는 버퍼의 헤드에 연속적으로 배치됩니다. 구조체의 포인터에서 참조하는 가변 크기 정보는 고정 크기 구조체의 끝과 버퍼 끝 사이에 있는 버퍼 내의 위치를 가리킵니다. 채워진 구조체의 수는 WSAEnumNameSpaceProviders의 반환 값입니다.

반환 값

WSAEnumNameSpaceProviders 함수는 lpnspBuffer에 복사된 WSANAMESPACE_INFO 구조체의 수를 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 번호를 검색할 수 있습니다.

오류 코드 의미
WSAEFAULT
lpnspBuffer 매개 변수는 NULL 포인터이거나 버퍼 길이인 lpdwBufferLength가 너무 작아 관련 WSANAMESPACE_INFO 구조 및 관련 정보를 모두 받을 수 없습니다. 이 오류가 반환되면 필요한 버퍼 길이가 lpdwBufferLength 매개 변수에 반환됩니다.
WSANOTINITIALISED
WS2_32.DLL 초기화되지 않았습니다. 애플리케이션은 Windows 소켓 함수를 호출하기 전에 먼저 WSAStartup 을 호출해야 합니다.
WSA_NOT_ENOUGH_MEMORY
작업을 수행할 메모리가 부족했습니다.

설명

WSAEnumNameSpaceProviders 함수는 lpnspBuffer 매개 변수가 가리키는 버퍼에서 사용 가능한 네임스페이스 공급자에 대한 정보를 반환합니다. 반환된 버퍼에는 버퍼의 헤드에 연속적으로 위치한 WSANAMESPACE_INFO 구조체의 배열이 포함됩니다. WSANAMESPACE_INFO 구조체의 포인터에서 참조하는 가변 크기 정보는 고정 WSANAMESPACE_INFO 구조체의 끝과 버퍼 끝 사이에 있는 버퍼 내의 위치를 가리킵니다. 에 채워진 WSANAMESPACE_INFO 구조체의 수는 에서 반환됩니다.
WSAEnumNameSpaceProviders 함수입니다.

WSANAMESPACE_INFO 구조 항목에는 네임스페이스 공급자가 설치되었을 때 WSCInstallNameSpace 및 WSCInstallNameSpace32 함수에 전달된 네임스페이스 항목에 대한 공급자별 정보가 포함됩니다.

WSAEnumNameSpaceProvidersEx 함수는 WSAEnumNameSpaceProviders 함수의 향상된 버전입니다. WSCEnumNameSpaceProvidersEx32 함수는 64비트 플랫폼에서 사용할 수 있는 32비트 네임스페이스 공급자에 대한 정보를 반환하는 향상된 버전의 WSAEnumNameSpaceProviders 함수입니다.

예제 코드

다음 예제에서는 WSAEnumNameSpaceProviders 함수를 사용하여 사용 가능한 네임스페이스 공급자에 대한 정보를 검색하는 방법을 보여 줍니다.
#ifndef UNICODE
#define UNICODE 1
#endif

#include <winsock2.h>
#include <ws2tcpip.h>
#include <objbase.h>
#include <stdio.h>

// Link with ws2_32.lib and ole32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "ole32.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
// Note: could also use malloc() and free()

int wmain()
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;
    int iError = 0;

    INT iNuminfo = 0;

    int i;
    

    // Allocate a 4K buffer to retrieve all the namespace providers
    DWORD dwInitialBufferLen = 4096;
    DWORD dwBufferLen;
    LPWSANAMESPACE_INFO lpProviderInfo;
    
    
    // variables needed for converting provider GUID to a string
    int iRet = 0;
    WCHAR GuidString[40] = {0};

    // Set dwBufferLen to the initial buffer length
    dwBufferLen = dwInitialBufferLen;
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }
    
    lpProviderInfo = (LPWSANAMESPACE_INFO) MALLOC(dwBufferLen);
    if (lpProviderInfo == NULL) {
        wprintf(L"Memory allocation for providers buffer failed\n");
        WSACleanup();
        return 1;
    }
    
    iNuminfo = WSAEnumNameSpaceProviders(&dwBufferLen, lpProviderInfo);
    if (iNuminfo == SOCKET_ERROR) {
        iError = WSAGetLastError();
        if (iError == WSAEFAULT && dwBufferLen != dwInitialBufferLen) {
            wprintf(L"WSAEnumNameSpaceProviders failed with too small a buffer\n");
            wprintf(L"  Increasing the buffer to %u\n\n", dwBufferLen);
            if (lpProviderInfo) {
               FREE(lpProviderInfo);
               lpProviderInfo = NULL;
            }        

            lpProviderInfo = (LPWSANAMESPACE_INFO) MALLOC(dwBufferLen);
            if (lpProviderInfo == NULL) {
                wprintf(L"Memory allocation for providers buffer failed\n");
                WSACleanup();
               return 1;
            }

            iNuminfo = WSAEnumNameSpaceProviders(&dwBufferLen, lpProviderInfo);
            if (iNuminfo == SOCKET_ERROR) {
               wprintf(L"WSAEnumNameSpaceProviders failed with error: %d\n",
                  WSAGetLastError() );
               if (lpProviderInfo) {
                  FREE(lpProviderInfo);
                  lpProviderInfo = NULL;
               }        
               WSACleanup();
               return 1;
            }
            else
                wprintf(L"\n");   
        } 
        else {   
            wprintf(L"WSAEnumNameSpaceProviders failed with error: %d\n",
               WSAGetLastError() );
            if (lpProviderInfo) {
               FREE(lpProviderInfo);
               lpProviderInfo = NULL;
            }        
           WSACleanup();
           return 1;
        } 
     }

       wprintf(L"WSAEnumNameSpaceProviders succeeded with provider data count = %d\n\n",
           iNuminfo);
       for (i= 0; i < iNuminfo; i++) {
            iRet = StringFromGUID2(lpProviderInfo[i].NSProviderId, (LPOLESTR) &GuidString, 39); 
            if (iRet == 0)
                wprintf(L"StringFromGUID2 failed\n");
            else 
                wprintf(L"NameSpace ProviderId[%u] = %ws\n",i, GuidString);

           wprintf(L"NameSpace[%u] = ", i);
           switch (lpProviderInfo[i].dwNameSpace) {
           case NS_DNS:
               wprintf(L"Domain Name System (NS_DNS)\n");
               break;
           case NS_WINS:
               wprintf(L"Windows Internet Naming Service (NS_WINS)\n");
               break;
           case NS_NETBT:
               wprintf(L"NetBIOS (NS_NETBT)\n");
               break;
           case NS_NTDS:
               wprintf(L"Windows NT Directory Services (NS_NTDS)\n");
               break;
           case NS_NLA:
               wprintf(L"Network Location Awareness (NS_NLA)\n");
               break;
           // following values only defined on Vista and later
#if(_WIN32_WINNT >= 0x0600)
           case NS_BTH:
               wprintf(L"Bluetooth (NS_BTH)\n");
               break;
           case NS_EMAIL:
               wprintf(L"Email (NS_EMAIL)\n");
               break;
           case NS_PNRPNAME:
               wprintf(L"Peer-to-peer (NS_PNRPNAME)\n");
               break;
           case NS_PNRPCLOUD:
               wprintf(L"Peer-to-peer collection (NS_PNRPCLOUD)\n");
               break;
#endif
           default:
               wprintf(L"Other value (%u)\n", lpProviderInfo[i].dwNameSpace);             
               break;
           }    

           if (lpProviderInfo[i].fActive)
               wprintf(L"Namespace[%u] is active\n", i);
           else    
               wprintf(L"Namespace[%u] is inactive\n", i);

           wprintf(L"NameSpace Version[%u] = %u\n", i, lpProviderInfo[i].dwVersion);

           wprintf(L"Namespace Identifier[%u] = %ws\n\n", i, lpProviderInfo[i].lpszIdentifier);
       }           

    if (lpProviderInfo) {
        FREE(lpProviderInfo);
        lpProviderInfo = NULL;
    }        
    WSACleanup();
    
    return 0;
}

Windows Phone 8:WSAEnumNameSpaceProvidersW 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에 대해 지원됩니다.

Windows 8.1Windows Server 2012 R2: WSAEnumNameSpaceProvidersW 함수는 Windows 8.1, Windows Server 2012 R2 이상의 Windows 스토어 앱에서 지원됩니다.

참고

winsock2.h 헤더는 WSAEnumNameSpaceProviders를 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock2.h
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

WSAEnumNameSpaceProvidersEx

WSAGetLastError

WSANAMESPACE_INFO

WSAStartup

WSCEnumNameSpaceProvidersEx32

WSCInstallNameSpace

WSCInstallNameSpaceEx

Winsock 함수

Winsock 참조