공유 소켓
WSADuplicateSocket 함수는 프로세스 간에 소켓 공유를 사용하도록 설정하기 위해 도입되었습니다. 원본 프로세스는 WSADuplicateSocket 을 호출하여 대상 프로세스 식별자에 대한 특수 WSAPROTOCOL_INFO 구조를 가져옵니다. 일부 IPC(Interprocess Communication) 메커니즘을 사용하여 이 구조체의 내용을 대상 프로세스에 전달합니다. 그런 다음 대상 프로세스는 WSPSocket 호출에서 WSAPROTOCOL_INFO 구조를 사용합니다. 이 함수에서 반환된 소켓 설명자는 기본 소켓에 대한 추가 소켓 설명자가 되므로 공유됩니다. 소켓 설명자는 프로세스의 모든 스레드에서 유효하기 때문에 WSADuplicateSocket 함수를 사용하지 않고 지정된 프로세스의 스레드 간에 소켓을 공유할 수 있습니다.
공유 소켓을 참조하는 두 개 이상의 설명자는 I/O와 관련된 한 독립적으로 사용할 수 있습니다. 그러나 Winsock 인터페이스는 액세스 제어 유형을 구현하지 않으므로 프로세스는 공유 소켓에서 모든 작업을 조정해야 합니다. 소켓 공유의 일반적인 예는 소켓을 만들고 연결을 설정하는 데 하나의 프로세스를 사용하는 것입니다. 그런 다음, 이 프로세스는 정보 교환을 담당하는 다른 프로세스에 소켓을 제공합니다.
WSADuplicateSocket 함수는 기본 소켓이 아닌 소켓 설명자를 만듭니다. 따라서 소켓과 연결된 모든 상태는 모든 설명자에서 공통적으로 유지됩니다. 예를 들어 설명자 하나를 사용하여 수행된 setsockopt 작업은 이후 또는 모든 설명자의 getsockopt 를 사용하여 표시됩니다. 프로세스는 중복된 소켓에서 closesocket 을 호출할 수 있으며 설명자가 할당 취소됩니다. 그러나 마지막 남은 설명자를 사용하여 closesocket 이 호출될 때까지 기본 소켓은 열린 상태로 유지됩니다.
공유 소켓에 대한 알림에는 WSAAsyncSelect 및 WSAEventSelect 함수의 일반적인 제약 조건이 적용됩니다. 공유 설명자를 사용하여 이러한 호출 중 하나를 실행하면 해당 등록에 사용된 설명자에 관계없이 소켓에 대한 이전 이벤트 등록이 취소됩니다. 따라서 예를 들어 A 수신 FD_READ 이벤트를 처리하고 B가 FD_WRITE 이벤트를 수신하도록 하는 것은 불가능합니다. 이러한 긴밀한 조정이 필요한 경우 개발자는 별도의 프로세스 대신 스레드를 사용하는 것이 좋습니다.