다음을 통해 공유


SPI의 공유 소켓

Windows 소켓의 프로세스 간 소켓 공유는 다음과 같이 구현됩니다. 원본 프로세스는 WSPDuplicateSocket 을 호출하여 특수 WSAPROTOCOL_INFO 구조를 가져옵니다. 일부 IPC(Interprocess Communication) 메커니즘을 사용하여 이 구조체의 내용을 대상 프로세스에 전달합니다. 그런 다음 대상 프로세스는 WSPSocket 호출에서 WSAPROTOCOL_INFO 구조를 사용합니다. 이 함수에서 반환된 소켓 설명자는 기본 소켓에 대한 추가 소켓 설명자가 되므로 공유됩니다.

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

이 메커니즘은 단일 스레드 및 선점 다중 스레드 버전의 Windows 모두에 적합하도록 설계되었습니다. 그러나 소켓 설명자는 모든 프로세스의 스레드에서 유효하기 때문에 WSPDuplicateSocket 함수를 사용하지 않고 지정된 프로세스의 스레드 간에 소켓을 공유할 수 있습니다.

설명자 할당 섹션에 설명된 대로 새 소켓 설명자가 할당된 경우 IFS 공급자는 WPUModifyIFSHandle을 호출해야 하고 비 IFS 공급자는 WPUCreateSocketHandle을 호출해야 합니다.

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

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