Condividi tramite


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