Функция обратного вызова LPWSPDUPLICATESOCKET (ws2spi.h)
Функция LPWSPDuplicateSocket возвращает структуру WSAPROTOCOL_INFO, которую можно использовать для создания дескриптора сокета для общего сокета.
Синтаксис
LPWSPDUPLICATESOCKET Lpwspduplicatesocket;
int Lpwspduplicatesocket(
[in] SOCKET s,
[in] DWORD dwProcessId,
[out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
[out] LPINT lpErrno
)
{...}
Параметры
[in] s
Дескриптор локального сокета.
[in] dwProcessId
Идентификатор целевого процесса, для которого будет использоваться общий сокет.
[out] lpProtocolInfo
Указатель на буфер, выделенный клиентом, который достаточно велик, чтобы содержать WSAPROTOCOL_INFO структуру. Поставщик услуг копирует содержимое структуры сведений о протоколе в этот буфер.
[out] lpErrno
Указатель на код ошибки.
Возвращаемое значение
Если ошибка не возникает, LPWSPDuplicateSocket возвращает ноль. В противном случае возвращается значение SOCKET_ERROR, а определенное число ошибок доступно в lpErrno.
Код ошибки | Значение |
---|---|
Сбой сетевой подсистемы. | |
Указывает, что один из указанных параметров недопустим. | |
Блокировка вызова сокетов Windows выполняется или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Дескрипторы сокетов недоступны. | |
Буферное пространство недоступно. Не удается создать сокет. | |
Дескриптор не является сокетом. |
Замечания
Исходный процесс вызывает LPWSPDuplicateSocket для получения специальной структуры WSAPROTOCOL_INFO. Он использует некоторый механизм взаимодействия между процессами (IPC) для передачи содержимого этой структуры целевому процессу, который, в свою очередь, использует его в вызове LPWSPSocket для получения дескриптора для повторяющегося сокета. Обратите внимание, что специальная WSAPROTOCOL_INFO структура может использоваться только один раз в целевом процессе.
Это ответственность поставщика услуг выполнять любые операции, необходимые в контексте исходного процесса, и создавать WSAPROTOCOL_INFO структуру, которая будет распознана при последующем отображении в качестве параметра для LPWSPSocket в контексте целевых процессов. Затем поставщик должен вернуть дескриптор сокета, ссылающийся на общий базовый сокет. dwProviderReserved член структуры WSAPROTOCOL_INFO доступен для использования поставщика услуг и может использоваться для хранения любой полезной информации контекста, включая повторяющийся дескриптор.
При выделении нового дескриптора сокета поставщик файловой системы (IFS) должен вызывать WPUModifyIFSHandle, а поставщик, отличный от IFS, должен вызывать WPUCreateSocketHandle. Поставщик IFS может использовать функцию DuplicateHandle. Чтобы обеспечить надлежащее выполнение дублирования сокетов, поставщик услуг, отличный от IFS, должен использовать функцию LPWSPDuplicateSocket.
В следующем примере показан один из возможных сценариев установки и использования общего сокета в режиме передачи.
Исходный процесс | IPC | Значение |
---|---|---|
|
==> | |
|
3) Получает запрос и ответ идентификатора процесса. | |
|
<== | |
|
||
|
||
|
==> | 7) Получает WSAPROTOCOL_INFO структуру. |
|
8) Вызовы LPWSPSocket для создания дескриптора общего сокета. | |
|
9) Использует общий сокет для обмена данными. | |
|
<== |
Дескрипторы, ссылающиеся на общий сокет, можно использовать независимо в том, что касается ввода-вывода. Однако интерфейс сокетов Windows не реализует какой-либо тип управления доступом, поэтому он зависит от процессов, участвующих в координации своих операций в общем сокете. Обычное использование общих сокетов заключается в том, чтобы иметь один процесс, ответственный за создание сокетов и установку подключений, передачу сокетов другим процессам, отвечающим за обмен информацией.
Так как все повторяющиеся дескрипторы сокетов, а не базовый сокет, все состояния, связанные с сокетом, хранятся в общем для всех дескрипторов. Например, операция
Уведомления о общих сокетах подвергаются обычным ограничениям LPWSPAsyncSelect и LPWSPEventSelect. Выдача любого из этих вызовов с помощью любого из общих дескрипторов отменяет предыдущую регистрацию событий для сокета независимо от того, какой дескриптор использовался для регистрации. Таким образом, например, общий сокет не может доставлять события FD_READ для обработки событий A и FD_WRITE для обработки событий B. В ситуациях, когда требуется такая жесткая координация, предполагается, что разработчики используют потоки вместо отдельных процессов.
Поставщик многоуровневых служб предоставляет реализацию этой функции, но он также является клиентом этой функции, если и при вызове LPWSPDuplicateSocket следующего слоя в цепочке протоколов. Некоторые особые соображения применяются к этого параметра lpProtocolInfo, так как он распространяется по слоям цепочки протоколов.
Если следующий слой в цепочке протоколов является другим слоем, то при вызове
Одним из важных преимуществ этой политики является то, что базовые поставщики услуг не должны знать о цепочках протоколов. Эта же политика применяется при распространении WSAPROTOCOL_INFO структуры через многоуровневую последовательность других функций, таких как LPWSPAddressToString, WSPStartup, LPWSPSocketили LPWSPStringToAddress.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 2000 Профессиональный [только классические приложения] |
минимальный поддерживаемый сервер | Windows 2000 Server [только классические приложения] |
заголовка | ws2spi.h |