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 | <== |