Soquetes compartilhados
A função WSADuplicateSocket é 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. 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. Em seguida, 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 setsockopt executada usando um descritor é subsequentemente visível usando um getsockopt de qualquer ou 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 closesocket seja chamado com o último descritor restante.
A notificação em soquetes compartilhados está sujeita às restrições usuais das funções WSAAsyncSelect e 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 processasse eventos de FD_WRITE de recebimento B. Para situações em que essa coordenação apertada é necessária, é sugerido que os desenvolvedores usem threads em vez de processos separados.