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


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