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


Функция обратного вызова 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.

Код ошибки Значение
WSAENETDOWN
Сбой сетевой подсистемы.
WSAEINVAL
Указывает, что один из указанных параметров недопустим.
WSAEINPROGRESS
Блокировка вызова сокетов Windows выполняется или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEMFILE
Дескрипторы сокетов недоступны.
WSAENOBUFS
Буферное пространство недоступно. Не удается создать сокет.
WSAENOTSOCK
Дескриптор не является сокетом.

Замечания

Исходный процесс вызывает LPWSPDuplicateSocket для получения специальной структуры WSAPROTOCOL_INFO. Он использует некоторый механизм взаимодействия между процессами (IPC) для передачи содержимого этой структуры целевому процессу, который, в свою очередь, использует его в вызове LPWSPSocket для получения дескриптора для повторяющегося сокета. Обратите внимание, что специальная WSAPROTOCOL_INFO структура может использоваться только один раз в целевом процессе.

Это ответственность поставщика услуг выполнять любые операции, необходимые в контексте исходного процесса, и создавать WSAPROTOCOL_INFO структуру, которая будет распознана при последующем отображении в качестве параметра для LPWSPSocket в контексте целевых процессов. Затем поставщик должен вернуть дескриптор сокета, ссылающийся на общий базовый сокет. dwProviderReserved член структуры WSAPROTOCOL_INFO доступен для использования поставщика услуг и может использоваться для хранения любой полезной информации контекста, включая повторяющийся дескриптор.

При выделении нового дескриптора сокета поставщик файловой системы (IFS) должен вызывать WPUModifyIFSHandle, а поставщик, отличный от IFS, должен вызывать WPUCreateSocketHandle. Поставщик IFS может использовать функцию DuplicateHandle. Чтобы обеспечить надлежащее выполнение дублирования сокетов, поставщик услуг, отличный от IFS, должен использовать функцию LPWSPDuplicateSocket.

В следующем примере показан один из возможных сценариев установки и использования общего сокета в режиме передачи.

Исходный процесс IPC Значение
1) LPWSPSocket, LPWSPConnect
2) Запросы идентификатора целевого процесса.
==>
3) Получает запрос и ответ идентификатора процесса.
4) Получает идентификатор процесса.
<==
5) Вызовы **LPWSPDuplicateSocket** для получения специальной WSAPROTOCOL_INFO структуры.
6) Отправляет WSAPROTOCOL_INFO структуру в целевой объект.
==> 7) Получает WSAPROTOCOL_INFO структуру.
8) Вызовы LPWSPSocket для создания дескриптора общего сокета.
9) Использует общий сокет для обмена данными.
10) LPWSPCloseSocket
<==

Дескрипторы, ссылающиеся на общий сокет, можно использовать независимо в том, что касается ввода-вывода. Однако интерфейс сокетов Windows не реализует какой-либо тип управления доступом, поэтому он зависит от процессов, участвующих в координации своих операций в общем сокете. Обычное использование общих сокетов заключается в том, чтобы иметь один процесс, ответственный за создание сокетов и установку подключений, передачу сокетов другим процессам, отвечающим за обмен информацией.

Так как все повторяющиеся дескрипторы сокетов, а не базовый сокет, все состояния, связанные с сокетом, хранятся в общем для всех дескрипторов. Например, операция WSPSetSockOpt, выполняемая с помощью одного дескриптора, впоследствии отображается с помощью LPWSPGetSockopt из любого или всех дескрипторов. Процесс может вызывать LPWSPCloseSocket на дублированном сокете, а дескриптор станет освобожденным. Однако базовый сокет остается открытым до тех пор, пока LPWSPClosesocket вызывается последним оставшимся дескриптором.

Уведомления о общих сокетах подвергаются обычным ограничениям LPWSPAsyncSelect и LPWSPEventSelect. Выдача любого из этих вызовов с помощью любого из общих дескрипторов отменяет предыдущую регистрацию событий для сокета независимо от того, какой дескриптор использовался для регистрации. Таким образом, например, общий сокет не может доставлять события FD_READ для обработки событий A и FD_WRITE для обработки событий B. В ситуациях, когда требуется такая жесткая координация, предполагается, что разработчики используют потоки вместо отдельных процессов.

Поставщик многоуровневых служб предоставляет реализацию этой функции, но он также является клиентом этой функции, если и при вызове LPWSPDuplicateSocket следующего слоя в цепочке протоколов. Некоторые особые соображения применяются к этого параметра lpProtocolInfo, так как он распространяется по слоям цепочки протоколов.

Если следующий слой в цепочке протоколов является другим слоем, то при вызове следующего слоя LPWSPDuplicateSocket этот слой должен передаваться на следующий слой lpProtocolInfo, ссылающийся на ту же неизмененную WSAPROTOCOL_INFO структуру с той же неизмененную информацию о цепочке. Однако если следующий слой является базовым протоколом (то есть последним элементом в цепочке), этот слой выполняет подстановку при вызове поставщика LPWSPDuplicateSocket. В этом случае структура WSAPROTOCOL_INFO базового поставщика должна ссылаться на параметр lpProtocolInfo.

Одним из важных преимуществ этой политики является то, что базовые поставщики услуг не должны знать о цепочках протоколов. Эта же политика применяется при распространении WSAPROTOCOL_INFO структуры через многоуровневую последовательность других функций, таких как LPWSPAddressToString, WSPStartup, LPWSPSocketили LPWSPStringToAddress.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000 Профессиональный [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
заголовка ws2spi.h

См. также

WPUCreateSocketHandle

WPUModifyIFSHandle