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


Функция WSADuplicateSocketA (winsock2.h)

Функция WSADuplicateSocket возвращает структуру WSAPROTOCOL_INFO, которую можно использовать для создания дескриптора сокета для общего сокета. Функцию WSADuplicateSocket нельзя использовать в сокете с поддержкой QOS.

Синтаксис

int WSAAPI WSADuplicateSocketA(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);

Параметры

[in] s

Дескриптор, определяющий локальный сокет.

[in] dwProcessId

Идентификатор целевого процесса, в котором будет использоваться повторяющийся сокет.

[out] lpProtocolInfo

Указатель на буфер, выделенный клиентом, достаточно большой, чтобы содержать WSAPROTOCOL_INFO структуру. Поставщик услуг копирует содержимое структуры сведений о протоколе в этот буфер.

Возвращаемое значение

Если ошибка не возникает, WSADuplicateSocket возвращает ноль. В противном случае возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить путем вызова WSAGetLastError.

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

Замечания

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

Сокеты можно совместно использовать между потоками в данном процессе без использования функции WSADuplicateSocket , так как дескриптор сокета действителен во всех потоках процесса.

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

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

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

Все сведения о состоянии, связанные с сокетом, хранятся в общем для всех дескрипторов, так как дескрипторы сокета дублируются, а не фактические сокеты. Например, операция setsockopt, выполняемая с помощью одного дескриптора, впоследствии отображается с помощью getsockopt из любого или всех дескрипторов. Исходный процесс и процесс назначения должны передавать одинаковые флаги соответствующим вызовы функций WSASocket. Если исходный процесс использует функцию сокета для создания сокета, целевой процесс должен передать флаг WSA_FLAG_OVERLAPPED в вызов функции WSASocket. Процесс может вызывать closesocket на дублированном сокете, а дескриптор станет освобожденным. Однако базовый сокет остается открытым, пока closesocket вызывается последним оставшимся дескриптором.

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

Windows 8.1 и Windows Server 2012 R2: функция WSADuplicateSocketW поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.

Заметка

Заголовок winsock2.h определяет WSADuplicateSocket как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 8.1, Windows Vista [классические приложения | Приложения UWP]
минимальный поддерживаемый сервер Windows Server 2003 [классические приложения | Приложения UWP]
целевая платформа Виндоус
заголовка winsock2.h
библиотеки Ws2_32.lib
DLL Ws2_32.dll

См. также

WSASocket

Функции Winsock

Справочник Winsock