Общие сокеты в SPI
Совместное использование сокетов между процессами в сокетах Windows реализуется следующим образом. Исходный процесс вызывает WSPDuplicateSocket для получения специальной структуры WSAPROTOCOL_INFO . Он использует механизм межпроцессного взаимодействия (IPC) для передачи содержимого этой структуры целевому процессу. Затем целевой процесс использует структуру WSAPROTOCOL_INFO в вызове WSPSocket. Дескриптор сокета, возвращаемый этой функцией, будет дополнительным дескриптором сокета для базового сокета, который, таким образом, становится общим.
Поставщик услуг несет ответственность за выполнение любых операций, необходимых в контексте исходного процесса, и создание структуры WSAPROTOCOL_INFO , которая будет распознана, когда впоследствии она появится в качестве параметра для WSPSocket в контексте целевых процессов. Член dwProviderReservedструктуры WSAPROTOCOL_INFO доступен для использования поставщиком услуг и может использоваться для хранения любой полезной информации контекста, включая дублированный дескриптор.
Этот механизм предназначен для однопоточных и упреждаемых многопоточных версий 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 | <== |