Função WSADuplicateSocketW (winsock2.h)
A função
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.
Valor de retorno
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 de erro | Significado |
---|---|
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função. | |
O subsistema de rede falhou. | |
Indica que um dos parâmetros especificados era inválido. | |
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. | |
Não há mais descritores de soquete disponíveis. | |
Nenhum espaço de buffer está disponível. O soquete não pode ser criado. | |
O descritor não é um soquete. | |
O parâmetro lpProtocolInfo não é uma parte válida do espaço de endereço do usuário. |
Observações
A função
Os 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 o identificador do processo de destino | ==> | |
3) Receber solicitação do identificador de processo e responder | ||
4) Identificador do processo de recebimento | <== | |
5) Chamar WSADuplicateSocket para obter uma estrutura de WSAPROTOCOL_INFO especial | ||
6) Enviar WSAPROTOCOL_INFO estrutura para o destino | ||
==> | 7) Receber WSAPROTOCOL_INFO estrutura | |
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 de
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 apertada é 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 no Windows 8.1, Windows Server 2012 R2 e posterior.
Nota
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 do pré-processador UNICODE. A combinação do uso do alias neutro de codificação com código que não é neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Conventions for Function Prototypes.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP] |
servidor com suporte mínimo | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
da Plataforma de Destino |
Windows |
cabeçalho | winsock2.h |
biblioteca | Ws2_32.lib |
de DLL |
Ws2_32.dll |
Consulte também
do Winsock Functions
referência Winsock