Общие сокеты
Функция WSADuplicateSocket представлена для включения совместного использования сокетов между процессами. Исходный процесс вызывает WSADuplicateSocket для получения специальной структуры WSAPROTOCOL_INFO для идентификатора целевого процесса. В нем используется некоторый механизм взаимодействия между процессами (IPC) для передачи содержимого этой структуры целевому процессу. Затем целевой процесс использует структуру WSAPROTOCOL_INFO в вызове WSPSocket. Дескриптор сокета, возвращаемый этой функцией, будет дополнительным дескриптором сокета для базового сокета, который таким образом становится общим. Сокеты можно совместно использовать между потоками в данном процессе без использования функции WSADuplicateSocket , так как дескриптор сокета действителен во всех потоках процесса.
Два дескриптора (или более), ссылающиеся на общий сокет, можно использовать независимо в том, что касается операций ввода-вывода. Однако интерфейс Winsock не реализует какой-либо тип управления доступом, поэтому процессы должны координировать любые операции с общим сокетом. Типичным примером сокетов общего доступа является использование одного процесса для создания сокетов и установления подключений. Затем этот процесс передает сокеты другим процессам, ответственным за обмен информацией.
Функция WSADuplicateSocket создает дескрипторы сокетов, а не базовый сокет. В результате все состояния, связанные с сокетом, хранятся в общем для всех дескрипторов. Например, операция setsockopt, выполняемая с помощью одного дескриптора, впоследствии отображается с помощью получения от любого или всех дескрипторов. Процесс может вызывать closesocket в дублированном сокете, а дескриптор станет освобожденным. Однако базовый сокет остается открытым, пока closesocket вызывается с последним оставшимся дескриптором.
Уведомление о общих сокетах распространяется на обычные ограничения WSAsyncSelect и функции WSAEventSelect. Выдача любого из этих вызовов с помощью любого из общих дескрипторов отменяет предыдущую регистрацию событий для сокета независимо от того, какой дескриптор использовался для регистрации. Таким образом, например, не удалось бы обработать события получения FD_READ И процесс получения FD_WRITE событий B. В ситуациях, когда требуется такая жесткая координация, предполагается, что разработчики используют потоки вместо отдельных процессов.