Compartilhar via


Função de retorno de chamada LPWSPDUPLICATESOCKET (ws2spi.h)

A função LPWSPDuplicateSocket retorna uma estrutura WSAPROTOCOL_INFO que pode ser usada para criar um descritor de soquete para um soquete compartilhado.

Sintaxe

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

Parâmetros

[in] s

Descritor de soquete local.

[in] dwProcessId

Identificador do processo de destino para o qual o soquete compartilhado 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.

[out] lpErrno

Ponteiro para o código de erro.

Valor de retorno

Se nenhum erro ocorrer, LPWSPDuplicateSocket retornará zero. Caso contrário, o valor de SOCKET_ERROR será retornado e um número de erro específico estará disponível em lpErrno.

Código de erro Significado
WSAENETDOWN
O subsistema de rede falhou.
WSAEINVAL
Indica que um dos parâmetros especificados era inválido.
WSAEINPROGRESS
O bloqueio da chamada do Windows Sockets está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEMFILE
Não há mais descritores de soquete disponíveis.
WSAENOBUFS
Nenhum espaço de buffer está disponível. O soquete não pode ser criado.
WSAENOTSOCK
O descritor não é um soquete.

Observações

Um processo de origem chama LPWSPDuplicateSocket 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 LPWSPSocket para obter um descritor para o soquete duplicado. Observe que a estrutura de WSAPROTOCOL_INFO especial só pode ser usada uma vez pelo processo de destino.

É responsabilidade do provedor de serviços executar todas as operações necessárias no contexto do processo de origem e criar uma estrutura de WSAPROTOCOL_INFO que será reconhecida quando ela aparecer posteriormente como um parâmetro para LPWSPSocket no contexto dos processos de destino. Em seguida, o provedor deve retornar um descritor de soquete que faça referência a um soquete subjacente comum. O dwProviderReserved membro da estrutura WSAPROTOCOL_INFO está disponível para uso do provedor de serviços e pode ser usado para armazenar qualquer informação de contexto útil, incluindo um identificador duplicado.

Quando um novo descritor de soquete é alocado, um provedor ifs (sistema de arquivos) instalável deve chamar WPUModifyIFSHandle e um provedor não IFS deve chamar WPUCreateSocketHandle. Um provedor IFS pode usar a função DuplicateHandle. Para garantir a execução adequada da duplicação do soquete, um provedor de serviços não IFS deve usar a função LPWSPDuplicateSocket.

Um cenário possível para estabelecer e usar um soquete compartilhado no modo de entrega é ilustrado no seguinte.

Processo de origem IPC Significado
1) LPWSPSocket, LPWSPConnect
2) Solicita o identificador do processo de destino.
==>
3) Recebe a solicitação do identificador de processo e responde.
4) Recebe o identificador do processo.
<==
5) Chama **LPWSPDuplicateSocket** para obter uma estrutura de WSAPROTOCOL_INFO especial.
6) Envia WSAPROTOCOL_INFO estrutura para o destino.
==> 7) Recebe WSAPROTOCOL_INFO estrutura.
8) Chama LPWSPSocket para criar o descritor de soquete compartilhado.
9) Usa soquete compartilhado para troca de dados.
10) LPWSPCloseSocket
<==

Os descritores que fazem referência a um soquete compartilhado podem ser usados independentemente no que diz respeito à 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. Um uso típico para soquetes compartilhados é ter um processo responsável por criar soquetes e estabelecer conexões, distribuir soquetes para outros processos responsáveis pela troca de informações.

Como o que está duplicado são os descritores de soquete e não o soquete subjacente, todos os estados associados a um soquete são mantidos em comum em todos os descritores. Por exemplo, uma operação de WSPSetSockOpt executada usando um descritor fica visível posteriormente usando um LPWSPGetSockopt de qualquer um ou de todos os descritores. Um processo pode chamar LPWSPCloseSocket em um soquete duplicado e o descritor será desalocado. O soquete subjacente, no entanto, permanecerá aberto até que LPWSPClosesocket seja chamado pelo último descritor restante.

A notificação em soquetes compartilhados está sujeita às restrições usuais de LPWSPAsyncSelect e LPWSPEventSelect. 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. Assim, por exemplo, 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, sugere-se que os desenvolvedores usem threads em vez de processos separados.

Um provedor de serviços em camadas fornece uma implementação dessa função, mas também é um cliente dessa função se e quando chama LPWSPDuplicateSocket da próxima camada na cadeia de protocolos. Algumas considerações especiais se aplicam ao parâmetro lpProtocolInfo dessa função, pois ele é propagado pelas camadas da cadeia de protocolo.

Se a próxima camada na cadeia de protocolo for outra camada, quando a próxima camada LPWSPDuplicateSocket for chamada, essa camada deverá passar para a próxima camada uma lpProtocolInfo que referencia a mesma estrutura de WSAPROTOCOL_INFO não modificada com as mesmas informações de cadeia não modificadas. No entanto, se a próxima camada for o protocolo base (ou seja, o último elemento na cadeia), essa camada executará uma substituição ao chamar o LPWSPDuplicateSocket do provedor de base. Nesse caso, a estrutura de WSAPROTOCOL_INFO do provedor base deve ser referenciada pelo parâmetro lpProtocolInfo.

Um benefício vital dessa política é que os provedores de serviços base não precisam estar cientes das cadeias de protocolo. Essa mesma política se aplica ao propagar uma estrutura de WSAPROTOCOL_INFO por meio de uma sequência em camadas de outras funções, como LPWSPAddressToString, WSPStartup, LPWSPSocketou LPWSPStringToAddress.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows 2000 Professional [somente aplicativos da área de trabalho]
servidor com suporte mínimo Windows 2000 Server [somente aplicativos da área de trabalho]
cabeçalho ws2spi.h

Consulte também

WPUCreateSocketHandle

WPUModifyIFSHandle