Функция 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.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен произойти успешный вызов WSAStartup . | |
Произошел сбой сетевой подсистемы. | |
Указывает, что один из указанных параметров был недопустимым. | |
Выполняется блокирующий вызов Windows Sockets 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 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 |