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


Функция 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 Sockets 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 Sockets не реализует какой-либо тип управления доступом, поэтому координация операций с общим сокетом зависит от процессов, участвующих в сокете. Общие сокеты обычно используются для одного процесса, отвечающего за создание сокетов и установление подключений, и других процессов, отвечающих за обмен информацией.

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

На уведомление для общих сокетов распространяются обычные ограничения WSAsyncSelect и 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]
Целевая платформа Windows
Header winsock2.h
Библиотека Ws2_32.lib
DLL Ws2_32.dll

См. также раздел

WSASocket

Функции Winsock

Справочник по Winsock