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