Socket condivisi in SPI
La condivisione dei socket tra processi in Windows Sockets viene implementata come segue. Un processo di origine chiama WSPDuplicateSocket per ottenere una struttura WSAPROTOCOL_INFO speciale. 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 di socket restituito da questa funzione sarà un descrittore socket aggiuntivo a un socket sottostante che diventa quindi condiviso.
È responsabilità del provider di servizi eseguire tutte le operazioni necessarie nel contesto del processo di origine e creare una struttura WSAPROTOCOL_INFO che verrà riconosciuta quando viene visualizzata successivamente come parametro per WSPSocket nel contesto dei processi di destinazione. Il dwProviderReserved membro della struttura WSAPROTOCOL_INFO è disponibile per l'uso del provider di servizi e può essere usato per archiviare eventuali informazioni di contesto utili, incluso un handle duplicato.
Questo meccanismo è progettato per essere appropriato per le versioni multithreading a thread singolo e preemptive di Windows. Si noti tuttavia che i socket possono essere condivisi tra thread in un determinato processo senza usare la funzione WSPDuplicateSocket, poiché un descrittore socket è valido in tutti i thread di un processo.
Come descritto nella sezione Descrittore di allocazione, quando i nuovi descrittori socket vengono allocati provider IFS devono chiamare WPUModifyIFSHandle e provider non IFS devono chiamare WPUCreateSocketHandle.
Uno scenario possibile per stabilire e usare un socket condiviso in modalità handoff è illustrato nella tabella seguente.
Processo di origine | IPC | Processo di destinazione |
---|---|---|
1) WSPSocket, WSPConnect | ||
2) Richiede l'identificatore del processo di destinazione. | ==> | |
3) Riceve la richiesta di identificatore del processo e risponde. | ||
4) Riceve l'identificatore del processo. | <== | |
5) Chiama WSPDuplicateSocket per ottenere una struttura WSAPROTOCOL_INFO speciale. | ||
6) Invia WSAPROTOCOL_INFO struttura alla destinazione. | ||
==> | 7) Riceve WSAPROTOCOL_INFO struttura. | |
8) Chiama WSPSocket per creare descrittore socket condiviso. | ||
9)Usa il socket condiviso per lo scambio di dati. | ||
10) WSPClosesocket | <== |