다음을 통해 공유


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) LPWSPSocketLPWSPConnect
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 마지막 남은 설명자가 때까지 기본 소켓이 열린 상태로 유지됩니다.

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

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

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

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

요구 사항

요구
지원되는 최소 클라이언트 Windows 2000 Professional [데스크톱 앱만 해당]
지원되는 최소 서버 Windows 2000 Server [데스크톱 앱만 해당]
헤더 ws2spi.h

참고 항목

WPUCreateSocketHandle

WPUModifyIFSHandle