Função de retorno de chamada LPWSPDUPLICATESOCKET (ws2spi.h)
A função LPWSPDuplicateSocket
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 |
---|---|
O subsistema de rede falhou. | |
Indica que um dos parâmetros especificados era inválido. | |
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. | |
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. |
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
Um cenário possível para estabelecer e usar um soquete compartilhado no modo de entrega é ilustrado no seguinte.
Processo de origem | IPC | Significado |
---|---|---|
|
||
|
==> | |
|
3) Recebe a solicitação do identificador de processo e responde. | |
|
<== | |
|
||
|
||
|
==> | 7) Recebe WSAPROTOCOL_INFO estrutura. |
|
8) Chama LPWSPSocket para criar o descritor de soquete compartilhado. | |
|
9) Usa soquete compartilhado para troca de dados. | |
<== |
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
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
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