Socket condivisi
La funzione WSADuplicateSocket viene introdotta per abilitare la condivisione dei socket tra i processi. Un processo di origine chiama WSADuplicateSocket per ottenere una struttura di WSAPROTOCOL_INFO speciale per un identificatore di processo di destinazione. Usa un meccanismo di comunicazione interprocesso (IPC) per passare il contenuto di questa struttura a un processo di destinazione. Il processo di destinazione usa quindi la struttura WSAPROTOCOL_INFO in una chiamata a WSPSocket. Il descrittore socket restituito da questa funzione sarà un descrittore di socket aggiuntivo a un socket sottostante che diventa quindi condiviso. I socket possono essere condivisi tra thread in un determinato processo senza usare la funzione WSADuplicateSocket perché un descrittore socket è valido in tutti i thread di un processo.
I due descrittori (o più) che fanno riferimento a un socket condiviso possono essere usati in modo indipendente per quanto riguarda le operazioni di I/O. Tuttavia, l'interfaccia Winsock non implementa alcun tipo di controllo di accesso, pertanto i processi devono coordinare qualsiasi operazione su un socket condiviso. Un esempio tipico di condivisione dei socket consiste nell'usare un processo per creare socket e stabilire connessioni. Questo processo quindi distribuisce socket ad altri processi responsabili dello scambio di informazioni.
La funzione WSADuplicateSocket crea descrittori socket e non il socket sottostante. Di conseguenza, tutti gli stati associati a un socket vengono mantenuti in comune in tutti i descrittori. Ad esempio, un'operazione setsockopt eseguita usando un descrittore è successivamente visibile usando un oggetto getsockopt da qualsiasi descrittore o da tutti i descrittori. Un processo può chiamare closesocket su un socket duplicato e il descrittore diventerà deallocato. Il socket sottostante rimane tuttavia aperto fino a quando non viene chiamato closesocket con l'ultimo descrittore rimanente.
La notifica sui socket condivisi è soggetta ai normali vincoli delle funzioni WSAAsyncSelect e WSAEventSelect . L'esecuzione di una di queste chiamate utilizzando uno dei descrittori condivisi annulla qualsiasi registrazione dell'evento precedente per il socket, indipendentemente dal descrittore usato per effettuare tale registrazione. Pertanto, ad esempio, non sarebbe possibile elaborare A ricevere FD_READ eventi ed elaborare B ricevono eventi FD_WRITE. Per situazioni in cui è necessario un coordinamento così stretto, è consigliabile che gli sviluppatori usino thread anziché processi separati.