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