Condividi tramite


Socket condivisi in SPI

La condivisione dei socket tra processi in Windows Sockets viene implementata come indicato di seguito. 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 socket restituito da questa funzione sarà un descrittore socket aggiuntivo a un socket sottostante che diventa così condiviso.

È responsabilità del provider di servizi eseguire le operazioni necessarie nel contesto del processo di origine e creare una struttura WSAPROTOCOL_INFO che verrà riconosciuta quando verrà successivamente visualizzata come parametro per WSPSocket nel contesto dei processi di destinazione. Il membro dwProviderReserved 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 a thread singolo e preemptive di Windows. Si noti tuttavia che i socket possono essere condivisi tra i 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 allocazione, quando i nuovi descrittori socket sono allocati provider IFS devono chiamare i provider WPUModifyIFSHandle e 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 il descrittore di socket condiviso.
9)Usa socket condiviso per lo scambio di dati.
10) WSPClosesocket <==