Поделиться через


Общие сокеты в 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 <==