Функция WSADuplicateSocketA (winsock2.h)
Функция WSADuplicateSocket возвращает структуру
Синтаксис
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.
Код ошибки | Значение |
---|---|
Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup. | |
Сбой сетевой подсистемы. | |
Указывает, что один из указанных параметров недопустим. | |
Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Дескрипторы сокетов недоступны. | |
Буферное пространство недоступно. Не удается создать сокет. | |
Дескриптор не является сокетом. | |
Параметр 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. Если исходный процесс использует функцию сокета
Уведомления о общих сокетах подвергаются обычным ограничениям 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 |
См. также
Справочник