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 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 retornado

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 do 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
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.

Comentários

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 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 referencie um soquete subjacente comum. O membro dwProviderReserved 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 de 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 de 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, entregar soquetes a outros processos responsáveis pela troca de informações.

Como o que é 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 WSPSetSockOpt executada usando um descritor fica visível posteriormente usando um LPWSPGetSockopt de qualquer ou todos os descritores. Um processo pode chamar LPWSPCloseSocket em um soquete duplicado e o descritor será desalocado. No entanto, o soquete subjacente 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, é sugerido 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 à medida que ela é propagada pelas camadas da cadeia de protocolos.

Se a próxima camada na cadeia de protocolo for outra camada, quando o LPWSPDuplicateSocket da próxima camada for chamado, essa camada deverá passar para a próxima camada um lpProtocolInfo que referencie 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 LPWSPDuplicateSocket do provedor 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 WSAPROTOCOL_INFO por meio de uma sequência em camadas de outras funções, como LPWSPAddressToString, WSPStartup, LPWSPSocket ou LPWSPStringToAddress.

Requisitos

   
Cliente mínimo com suporte Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows 2000 Server [somente aplicativos da área de trabalho]
Cabeçalho ws2spi.h

Confira também

Wpucreatesockethandle

WPUModifyIFSHandle