Função WSADuplicateSocketW (winsock2.h)

A função WSADuplicateSocket retorna uma estrutura WSAPROTOCOL_INFO que pode ser usada para criar um novo descritor de soquete para um soquete compartilhado. A função WSADuplicateSocket não pode ser usada em um soquete habilitado para QOS.

Sintaxe

int WSAAPI WSADuplicateSocketW(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo
);

Parâmetros

[in] s

Descritor que identifica o soquete local.

[in] dwProcessId

Identificador de processo do processo de destino no qual o soquete duplicado será usado.

[out] lpProtocolInfo

Ponteiro para um buffer, alocado pelo cliente, que é grande o suficiente para conter uma estrutura de WSAPROTOCOL_INFO . O provedor de serviços copia o conteúdo da estrutura de informações de protocolo para esse buffer.

Retornar valor

Se nenhum erro ocorrer, WSADuplicateSocket retornará zero. Caso contrário, um valor de SOCKET_ERROR será retornado e um código de erro específico poderá ser recuperado chamando WSAGetLastError.

Código do erro Significado
WSANOTINITIALISED
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função.
WSAENETDOWN
O subsistema de rede falhou.
WSAEINVAL
Indica que um dos parâmetros especificados era inválido.
WSAEINPROGRESS
Uma chamada de bloqueio do Windows Sockets 1.1 está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEMFILE
Nenhum descritor de soquete disponível.
WSAENOBUFS
Nenhum espaço de buffer disponível. O soquete não pode ser criado.
WSAENOTSOCK
O descritor não é um soquete.
WSAEFAULT
O parâmetro lpProtocolInfo não é uma parte válida do espaço de endereço do usuário.

Comentários

A função WSADuplicateSocket é usada para habilitar o compartilhamento de soquete entre processos. Um processo de origem chama WSADuplicateSocket para obter uma estrutura de WSAPROTOCOL_INFO especial. Ele usa algum mecanismo de IPC (comunicações entre processos) para passar o conteúdo dessa estrutura para um processo de destino, que, por sua vez, o usa em uma chamada para WSASocket para obter um descritor para o soquete duplicado. A estrutura de WSAPROTOCOL_INFO especial só pode ser usada uma vez pelo processo de destino.

Soquetes podem ser compartilhados entre threads em um determinado processo sem usar a função WSADuplicateSocket porque um descritor de soquete é válido em todos os threads de um processo.

Um cenário possível para estabelecer e entregar um soquete compartilhado é ilustrado na tabela a seguir.

Processo de origem IPC Processo de Destino
1) WSASocket, WSAConnect
2) Solicitar identificador de processo de destino ==>
3) Receber solicitação do identificador do processo e responder
4) Identificador do processo de recebimento <==
5) Chame WSADuplicateSocket para obter uma estrutura de WSAPROTOCOL_INFO especial
6) Enviar WSAPROTOCOL_INFO estrutura para o destino
==> 7) Estrutura de WSAPROTOCOL_INFO de recebimento
8) Chame WSASocket para criar o descritor de soquete compartilhado.
9) Usar soquete compartilhado para troca de dados
10) closesocket <==
 

Os descritores que fazem referência a um soquete compartilhado podem ser usados independentemente para E/S. No entanto, a interface do Windows Sockets não implementa nenhum tipo de controle de acesso, portanto, cabe aos processos envolvidos coordenar suas operações em um soquete compartilhado. Os soquetes compartilhados normalmente são usados para ter um processo responsável por criar soquetes e estabelecer conexões e outros processos responsáveis pela troca de informações.

Todas as informações de estado associadas a um soquete são mantidas em comum em todos os descritores porque os descritores de soquete são duplicados e não o soquete real. Por exemplo, uma operação setsockopt executada usando um descritor fica visível posteriormente usando um getsockopt de qualquer ou todos os descritores. O processo de origem e o processo de destino devem passar os mesmos sinalizadores para suas respectivas chamadas de função WSASocket . Se o processo de origem usar a função de soquete para criar o soquete, o processo de destino deverá passar o sinalizador WSA_FLAG_OVERLAPPED para sua chamada de função WSASocket . Um processo pode chamar closesocket em um soquete duplicado e o descritor será desalocado. No entanto, o soquete subjacente permanecerá aberto até que closesocket seja chamado pelo último descritor restante.

A notificação em soquetes compartilhados está sujeita às restrições usuais de WSAAsyncSelect e WSAEventSelect. A emissão de qualquer uma dessas chamadas usando qualquer um dos descritores compartilhados cancela qualquer registro de evento anterior para o soquete, independentemente de qual descritor foi usado para fazer esse registro. Portanto, um soquete compartilhado não pode fornecer eventos FD_READ para processar eventos A e FD_WRITE para processar B. Para situações em que essa coordenação rígida é necessária, os desenvolvedores seriam aconselhados a usar threads em vez de processos separados.

Windows 8.1 e Windows Server 2012 R2: a função WSADuplicateSocketW tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posterior.

Observação

O cabeçalho winsock2.h define WSADuplicateSocket como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante de pré-processador UNICODE. Misturar o uso do alias neutro de codificação com código que não seja neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Convenções para protótipos de função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho winsock2.h
Biblioteca Ws2_32.lib
DLL Ws2_32.dll

Confira também

Wsasocket

Funções Winsock

Referência de Winsock