Soquetes compartilhados
A funçãoWSADuplicateSocket é introduzida para habilitar o compartilhamento de soquete entre processos. Um processo de origem chama WSADuplicateSocket para obter uma estrutura de WSAPROTOCOL_INFO especial para um identificador de processo de destino. Ele usa algum mecanismo de IPC (comunicações 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. Os soquetes podem ser compartilhados entre threads em um determinado processo sem usar a função WSADuplicateSocket porque um descritor de soquete é válido em todos os threads de um processo.
Os dois (ou mais) descritores que fazem referência a um soquete compartilhado podem ser usados independentemente no que diz respeito à E/S. No entanto, a interface Winsock não implementa nenhum tipo de controle de acesso, portanto, os processos devem coordenar quaisquer operações em um soquete compartilhado. Um exemplo típico de compartilhamento de soquetes é usar um processo para criar soquetes e estabelecer conexões. Esse processo entrega soquetes para outros processos responsáveis pela troca de informações.
A função WSADuplicateSocket cria descritores de soquete e não o soquete subjacente. Como resultado, todos os estados associados a um soquete são mantidos em comum em todos os descritores. Por exemplo, uma operação de setsockopt executada usando um descritor fica visível posteriormente usando um de getsockopt de qualquer um ou de todos os descritores. Um processo pode chamar closesocket em um soquete duplicado e o descritor será desalocado. O soquete subjacente, no entanto, permanece aberto até que fechar seja chamado com o último descritor restante.
A notificação em soquetes compartilhados está sujeita às restrições usuais do WSAAsyncSelect e funções de WSAEventSelect. 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, não seria possível que o processo A recebesse eventos FD_READ e processe os eventos de recebimento B FD_WRITE. Para situações em que essa coordenação apertada é necessária, sugere-se que os desenvolvedores usem threads em vez de processos separados.