LPWSPDUPLICATESOCKET 콜백 함수(ws2spi.h)

LPWSPDuplicateSocket 함수는 공유 소켓에 대한 새 소켓 설명자를 만드는 데 사용할 수 있는 WSAPROTOCOL_INFO 구조를 반환합니다.

구문

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

매개 변수

[in] s

로컬 소켓 설명자입니다.

[in] dwProcessId

공유 소켓을 사용할 대상 프로세스의 식별자입니다.

[out] lpProtocolInfo

WSAPROTOCOL_INFO 구조를 포함할 수 있을 만큼 큰 클라이언트에서 할당한 버퍼에 대한 포인터입니다. 서비스 공급자는 프로토콜 정보 구조 콘텐츠를 이 버퍼에 복사합니다.

[out] lpErrno

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

반환 값

오류가 발생하지 않으면 LPWSPDuplicateSocket 은 0을 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 lpErrno에서 특정 오류 번호를 사용할 수 있습니다.

오류 코드 의미
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEINVAL
지정된 매개 변수 중 하나가 잘못되었음을 나타냅니다.
WSAEINPROGRESS
Windows 소켓 호출 차단이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEMFILE
더 이상 소켓 설명자를 사용할 수 없습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다. 소켓을 만들 수 없습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.

설명

원본 프로세스는 LPWSPDuplicateSocket 을 호출하여 특수 WSAPROTOCOL_INFO 구조를 가져옵니다. 일부 IPC(Interprocess Communications) 메커니즘을 사용하여 이 구조체의 내용을 대상 프로세스에 전달합니다. 그러면 LPWSPSocket 호출에서 이를 사용하여 중복된 소켓에 대한 설명자를 가져옵니다. 특수 WSAPROTOCOL_INFO 구조체는 대상 프로세스에서 한 번만 사용할 수 있습니다.

원본 프로세스 컨텍스트에서 필요한 작업을 수행하고 이후에 대상 프로세스의 컨텍스트에서 LPWSPSocket에 대한 매개 변수로 표시될 때 인식되는 WSAPROTOCOL_INFO 구조를 만드는 것은 서비스 공급자의 책임입니다. 공급자는 공통 기본 소켓을 참조하는 소켓 설명자를 반환해야 합니다. WSAPROTOCOL_INFO 구조의 dwProviderReserved 멤버는 서비스 공급자가 사용할 수 있으며 중복 핸들을 포함한 유용한 컨텍스트 정보를 저장하는 데 사용할 수 있습니다.

새 소켓 설명자가 할당되면 IFS(설치 가능한 파일 시스템) 공급자가 WPUModifyIFSHandle을 호출해야 하며 비 IFS 공급자는 WPUCreateSocketHandle을 호출해야 합니다. IFS 공급자는 DuplicateHandle 함수를 사용할 수 있습니다. 소켓 중복을 적절하게 실행하려면 비 IFS 서비스 공급자가 LPWSPDuplicateSocket 함수를 사용해야 합니다.

핸드오프 모드에서 공유 소켓을 설정하고 사용하는 한 가지 가능한 시나리오는 다음과 같이 설명되어 있습니다.

원본 프로세스 IPC 의미
1) LPWSPSocket, LPWSPConnect
2) 대상 프로세스 식별자를 요청합니다.
==>
3) 프로세스 식별자 요청을 수신하고 응답합니다.
4) 프로세스 식별자를 받습니다.
<==
5) **LPWSPDuplicateSocket**을 호출하여 특수 WSAPROTOCOL_INFO 구조를 가져옵니다.
6) 대상에 WSAPROTOCOL_INFO 구조를 보냅니다.
==> 7) WSAPROTOCOL_INFO 구조를 받습니다.
8) LPWSPSocket 을 호출하여 공유 소켓 설명자를 만듭니다.
9) 데이터 교환에 공유 소켓을 사용합니다.
10) LPWSPCloseSocket
<==

공유 소켓을 참조하는 설명자는 I/O와 관련된 한 독립적으로 사용할 수 있습니다. 그러나 Windows 소켓 인터페이스는 모든 유형의 액세스 제어를 구현하지 않으므로 공유 소켓에서 작업을 조정하는 것은 관련된 프로세스에 달려 있습니다. 공유 소켓의 일반적인 용도는 소켓 만들기 및 연결 설정, 정보 교환을 담당하는 다른 프로세스에 소켓 전달을 담당하는 하나의 프로세스를 갖는 것입니다.

중복된 항목은 기본 소켓이 아닌 소켓 설명자이므로 소켓과 연결된 모든 상태는 모든 설명자에서 공통적으로 유지됩니다. 예를 들어 한 설명자를 사용하여 수행된 WSPSetSockOpt 작업은 이후에 또는 모든 설명자의 LPWSPGetSockopt 를 사용하여 표시됩니다. 프로세스는 중복된 소켓에서 LPWSPCloseSocket 을 호출할 수 있으며 설명자는 할당 취소됩니다. 그러나 마지막 남은 설명자가 LPWSPClosesocket 을 호출할 때까지 기본 소켓은 열린 상태로 유지됩니다.

공유 소켓에 대한 알림에는 LPWSPAsyncSelect 및 LPWSPEventSelect 의 일반적인 제약 조건이 적용 됩니다. 공유 설명자를 사용하여 이러한 호출 중 하나를 실행하면 해당 등록에 사용된 설명자에 관계없이 소켓에 대한 이전 이벤트 등록이 취소됩니다. 따라서 예를 들어 공유 소켓은 A를 처리하고 B를 처리하도록 이벤트를 FD_WRITE FD_READ 이벤트를 제공할 수 없습니다. 이러한 긴밀한 조정이 필요한 경우 개발자는 별도의 프로세스 대신 스레드를 사용하는 것이 좋습니다.

계층화된 서비스 공급자는 이 함수의 구현을 제공하지만 프로토콜 체인에서 다음 계층의 LPWSPDuplicateSocket 을 호출하는 경우 이 함수의 클라이언트이기도 합니다. 프로토콜 체인의 계층을 통해 전파되므로 이 함수의 lpProtocolInfo 매개 변수에는 몇 가지 특별한 고려 사항이 적용됩니다.

프로토콜 체인의 다음 계층이 다른 계층인 경우 다음 계층의 LPWSPDuplicateSocket이 호출될 때 이 계층은 수정되지 않은 동일한 체인 정보를 사용하여 수정되지 않은 동일한 WSAPROTOCOL_INFO 구조를 참조하는 lpProtocolInfo를 다음 계층에 전달해야 합니다. 그러나 다음 계층이 기본 프로토콜(즉, 체인의 마지막 요소)인 경우 이 계층은 기본 공급자의 LPWSPDuplicateSocket을 호출할 때 대체를 수행합니다. 이 경우 lpProtocolInfo 매개 변수에서 기본 공급자의 WSAPROTOCOL_INFO 구조를 참조해야 합니다.

이 정책의 중요한 이점 중 하나는 기본 서비스 공급자가 프로토콜 체인을 인식할 필요가 없다는 것입니다. 이 동일한 정책은 LPWSPAddressToString, WSPStartup, LPWSPSocket 또는 LPWSPStringToAddress와 같은 다른 함수의 계층화된 시퀀스를 통해 WSAPROTOCOL_INFO구조를 전파 때 적용됩니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
머리글 ws2spi.h

참고 항목

WPUCreateSocketHandle

WPUModifyIFSHandle