다음을 통해 공유


WPUCreateSocketHandle 함수(ws2spi.h)

WPUCreateSocketHandle 함수는 새 소켓 핸들을 만듭니다.

구문

SOCKET WPUCreateSocketHandle(
  [in]  DWORD     dwCatalogEntryId,
  [in]  DWORD_PTR dwContext,
  [out] LPINT     lpErrno
);

매개 변수

[in] dwCatalogEntryId

호출 서비스 공급자를 식별하는 설명자입니다.

[in] dwContext

새 소켓 핸들과 연결할 컨텍스트 값입니다.

[out] lpErrno

오류 코드에 대한 포인터입니다.

반환 값

오류가 발생하지 않으면 WPUCreateSocketHandle 은 새 소켓 핸들을 반환합니다. 그렇지 않으면 INVALID_SOCKET 반환되고 lpErrno에서 특정 오류 코드를 사용할 수 있습니다.

오류 코드 의미
WSAENOBUFS
새 소켓 핸들을 만드는 데 사용할 수 있는 버퍼가 충분하지 않습니다.
 
 

설명

WPUCreateSocketHandle 함수는 지정된 공급자에 대한 새 소켓 핸들을 만듭니다. WPUCreateSocketHandle에서 만든 핸들은 실제 파일 시스템 핸들과 구별할 수 없습니다. 이것은 두 가지 측면에서 중요합니다. 먼저 Windows 소켓 2 아키텍처는 파일 시스템 함수 ReadFileWriteFile 을 이 서비스 공급자의 LPWSPRecvLPWSPSend 함수로 각각 리디렉션합니다. 둘째, 완료 포트를 지원하는 운영 체제에서 Windows Sockets 2 아키텍처는 완성 포트를 소켓 핸들과 연결하고 이를 사용하여 겹치는 I/O 완성을 보고할 수 있도록 지원합니다.

**참고** ReadFileWriteFile 을 리디렉션하는 메커니즘에는 반드시 리디렉터에 도착하기 위한 사용자 간 커널 전환과 [LPWSPRecv](nc-ws2spi-lpwsprecv.md) 또는 [LPWSPSend](nc-ws2spi-lpwspsend.md)로 전환하기 위한 커널 간 전환이 포함됩니다. 반환될 때 이러한 전환은 역방향으로 다시 추적됩니다. 이는 상당한 성능 저하가 될 수 있습니다. **WPUCreateSocketHandle**을 사용하여 소켓 핸들을 만드는 서비스 공급자는 WSAProtocol_Info 구조에서 XP1_IFS_HANDLES 설정하면 안 됩니다. 클라이언트는 **ReadFile** 및 **WriteFile**을 사용하지 않도록 지침으로 XP1_IFS_HANDLES 없어야 합니다.
 
**참고** **WPUCreateSocketHandle**을 사용하여 만든 소켓 핸들과 함께 완료 포트 메커니즘을 사용하는 경우 예외적인 성능 저하는 없습니다. 서비스 공급자는 WPUCompleteOverlappedRequest 를 사용하여 완료 포트가 포함될 수 있는 겹치는 I/O 작업의 완료를 알려야 합니다. 클라이언트는 운영 체제 함수를 자유롭게 사용하여 완료 알림을 위해 완료 포트를 만들고 연결하고 사용할 수 있습니다(예: CreateIoCompletionPort, GetQueuedCompletionStatus, 자세한 내용은 관련 운영 체제 설명서 참조). 완료 포트는 Windows 소켓 2에서 제공하는 다른 비동기 알림 메커니즘과 통합되지 않습니다. 즉, 클라이언트는 여러 이벤트 및 완료 콜백을 포함하는 다중 대기를 수행할 수 있지만 다중 대기가 완료 포트를 포함하도록 미리 정의된 방법은 없습니다.
 
 
**계층화된 서비스 공급자 고려 사항**

이 절차는 계층화된 서비스 공급자에게 특히 중요합니다. 계층화된 서비스 공급자는 WPUModifyIFSHandle 대신 이 절차를 사용하여 클라이언트에 노출하는 소켓 핸들을 만들 수 있습니다. 이 절차를 사용할 경우 소켓과 관련된 모든 I/O 요청이 이 서비스 공급자를 통과하도록 보장할 수 있다는 장점이 있습니다. 클라이언트가 소켓이 파일 시스템 핸들이라고 가정하고 파일 시스템 함수 ReadFileWriteFile 을 호출하는 경우에도 마찬가지입니다(이 가정에 대한 성능 저하를 지불함).

모든 I/O가 이 계층을 통과하도록 보장하는 것은 실제 I/O 작업 전후에 I/O 스트림을 처리해야 하는 계층에 대한 요구 사항입니다. WPUCreateSocketHandle을 사용하여 소켓 핸들을 만들고 WSPStartup 시 적절한 서비스 공급자 인터페이스 프로시저 디스패치 테이블을 지정하면 계층이 각 I/O 작업을 시작하는 데 참여할 수 있습니다. 클라이언트가 겹치는 I/O 작업을 요청하는 경우 이 서비스 공급자 계층은 일반적으로 I/O 완료 알림의 경로로 들어가도록 정렬해야 합니다.

이것이 사실인 이유를 확인하려면 클라이언트가 겹치는 I/O 완료 알림을 위해 완료 포트를 소켓 핸들과 연결하면 어떻게 되는지 고려합니다. 포트는 다음 계층의 소켓 핸들이 아니라 이 계층에서 노출하는 소켓 핸들과 연결됩니다. 이 계층에서 완료 포트가 연결되어 있는지 또는 포트가 무엇인지 확인할 수 있는 방법은 없습니다. 이 계층은 다음 계층의 I/O 작업을 호출할 때 다음 계층의 소켓 핸들을 사용합니다. 다음 계층의 소켓 핸들은 동일한 완료 포트 연결을 갖지 않습니다. 추가 도움이 없으면 클라이언트의 예상 완료 포트 알림이 발생하지 않습니다.

계층화된 서비스 공급자가 이를 관리하는 일반적인 방법은 다음 계층에서 I/O 작업을 호출할 때 다른 겹치는 I/O 구조와 서로 다른 겹치는 I/O 매개 변수를 대체하는 것입니다. 대체 겹치는 I/O 구조체는 클라이언트의 저장된 겹치는 구조체 및 매개 변수를 참조합니다. 다음 계층의 호출은 콜백 알림을 설정합니다. 콜백 알림이 발생하면 이 계층은 원하는 사후 처리를 수행하고, 클라이언트를 대신하여 저장된 겹치는 I/O 정보를 검색하고, 대체 구조를 삭제하고, 클라이언트에 적절한 완료 알림을 전달합니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 ws2spi.h

참고 항목

WPUCloseSocketHandle

WPUCompleteOverlappedRequest

WPUModifyIFSHandle

WPUQuerySocketHandleContext

LPWSPRecv

LPWSPSend

WSPStartup