Compartilhar via


Soquetes compartilhados no SPI

O compartilhamento de soquete entre processos no Windows Sockets é implementado da seguinte maneira. Um processo de origem chama WSPDuplicateSocket para obter uma estrutura de WSAPROTOCOL_INFO especial. Ele usa algum mecanismo de IPC (comunicação entre processos) para passar o conteúdo dessa estrutura para um processo de destino. Em seguida, o processo de destino usa a estrutura WSAPROTOCOL_INFO em uma chamada para WSPSocket. O descritor de soquete retornado por essa função será um descritor de soquete adicional para um soquete subjacente que, portanto, se torna compartilhado.

É 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 WSPSocket no contexto dos processos de destino. 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.

Esse mecanismo foi projetado para ser apropriado para versões multithread de thread único e preemptivas do Windows. No entanto, observe que os soquetes podem ser compartilhados entre threads em um determinado processo sem usar a função WSPDuplicateSocket , pois um descritor de soquete é válido em todos os threads de um processo.

Conforme descrito na seção Alocação de descritor, quando novos descritores de soquete são alocados provedores IFS devem chamar WPUModifyIFSHandle e provedores não IFS devem chamar WPUCreateSocketHandle.

Um cenário possível para estabelecer e usar um soquete compartilhado em um modo de entrega é ilustrado na tabela a seguir.

Processo de origem IPC Processo de Destino
1) WSPSocket, WSPConnect
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 WSPDuplicateSocket para obter uma estrutura de WSAPROTOCOL_INFO especial.
6) Envia WSAPROTOCOL_INFO estrutura para o destino.
==> 7) Recebe WSAPROTOCOL_INFO estrutura.
8) Chama o WSPSocket para criar o descritor de soquete compartilhado.
9)Usa soquete compartilhado para troca de dados.
10) WSPClosesocket <==