Funzione di callback LPWSPDUPLICATESOCKET (ws2spi.h)
La funzione LPWSPDuplicateSocket restituisce una struttura WSAPROTOCOL_INFO che può essere usata per creare un nuovo descrittore socket per un socket condiviso.
Sintassi
LPWSPDUPLICATESOCKET Lpwspduplicatesocket;
int Lpwspduplicatesocket(
[in] SOCKET s,
[in] DWORD dwProcessId,
[out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
[out] LPINT lpErrno
)
{...}
Parametri
[in] s
Descrittore socket locale.
[in] dwProcessId
Identificatore del processo di destinazione per il quale verrà usato il socket condiviso.
[out] lpProtocolInfo
Puntatore a un buffer allocato dal client con dimensioni sufficienti per contenere una struttura WSAPROTOCOL_INFO. Il provider di servizi copia il contenuto della struttura delle informazioni del protocollo in questo buffer.
[out] lpErrno
Puntatore al codice di errore.
Valore restituito
Se non si verifica alcun errore, LPWSPDuplicateSocket restituisce zero. In caso contrario, viene restituito il valore di SOCKET_ERROR e un numero di errore specifico è disponibile in lpErrno.
Codice errore | Significato |
---|---|
Il sottosistema di rete non è riuscito. | |
Indica che uno dei parametri specificati non è valido. | |
Il blocco della chiamata a Windows Sockets è in corso o il provider di servizi sta ancora elaborando una funzione di callback. | |
Non sono disponibili altri descrittori socket. | |
Non è disponibile alcuno spazio nel buffer. Impossibile creare il socket. | |
Il descrittore non è un socket. |
Osservazioni
Un processo di origine chiama LPWSPDuplicateSocket 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, che a sua volta lo usa in una chiamata a LPWSPSocket per ottenere un descrittore per il socket duplicato. Si noti che la struttura WSAPROTOCOL_INFO speciale può essere usata una sola volta dal processo di destinazione.
È 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 successivamente visualizzata come parametro per LPWSPSocket nel contesto dei processi di destinazione. Il provider deve quindi restituire un descrittore socket che fa riferimento a un socket sottostante comune. 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.
Quando viene allocato un nuovo descrittore socket, un provider IFS (Installable File System) deve chiamare WPUModifyIFSHandlee un provider non IFS deve chiamare WPUCreateSocketHandle. Un provider IFS può usare la funzione DuplicateHandle
Uno scenario possibile per stabilire e usare un socket condiviso in modalità handoff è illustrato di seguito.
Processo di origine | IPC | Significato |
---|---|---|
|
==> | |
|
3) Riceve la richiesta di identificatore del processo e risponde. | |
|
<== | |
|
||
|
||
|
==> | 7) Riceve WSAPROTOCOL_INFO struttura. |
|
8) Chiama LPWSPSocket per creare descrittore socket condiviso. | |
|
9) Usa socket condiviso per lo scambio di dati. | |
|
<== |
I descrittori che fanno riferimento a un socket condiviso possono essere usati in modo indipendente per quanto riguarda le operazioni di I/O. Tuttavia, l'interfaccia Windows Sockets non implementa alcun tipo di controllo di accesso, quindi spetta ai processi coinvolti per coordinare le operazioni su un socket condiviso. Un uso tipico per i socket condivisi consiste nell'avere un processo responsabile della creazione di socket e della creazione di connessioni, consegnare socket ad altri processi responsabili dello scambio di informazioni.
Poiché ciò che viene duplicato sono i descrittori del socket e non il socket sottostante, tutti gli stati associati a un socket vengono mantenuti in comune in tutti i descrittori. Ad esempio, un'operazione di WSPSetSockOpt
La notifica sui socket condivisi è soggetta ai soliti vincoli di LPWSPAsyncSelect e LPWSPEventSelect. L'esecuzione di una di queste chiamate utilizzando uno dei descrittori condivisi annulla qualsiasi registrazione evento precedente per il socket, indipendentemente dal descrittore usato per effettuare tale registrazione. Pertanto, ad esempio, un socket condiviso non può recapitare FD_READ eventi per elaborare gli eventi A e FD_WRITE per elaborare B. Per situazioni in cui è necessario un coordinamento così stretto, è consigliabile che gli sviluppatori usino thread invece di processi separati.
Un provider di servizi a più livelli fornisce un'implementazione di questa funzione, ma è anche un client di questa funzione se e quando chiama LPWSPDuplicateSocket del livello successivo nella catena di protocolli. Alcune considerazioni speciali si applicano al parametro lpProtocolInfo durante la propagazione nei livelli della catena di protocolli.
Se il livello successivo nella catena di protocolli è un altro livello, quando viene chiamato il livello successivo LPWSPDuplicateSocket, questo livello deve passare al livello successivo un lpProtocolInfo che fa riferimento alla stessa struttura WSAPROTOCOL_INFO non modificata con le stesse informazioni sulla catena non modificata. Tuttavia, se il livello successivo è il protocollo di base ,ovvero l'ultimo elemento della catena, questo livello esegue una sostituzione quando si chiama il provider di base LPWSPDuplicateSocket. In questo caso, la struttura di WSAPROTOCOL_INFO del provider di base deve fare riferimento al parametro lpProtocolInfo.
Un vantaggio fondamentale di questo criterio è che i provider di servizi di base non devono essere consapevoli delle catene di protocolli. Questo stesso criterio si applica quando si propaga una struttura WSAPROTOCOL_INFO tramite una sequenza a più livelli di altre funzioni, ad esempio LPWSPAddressToString, WSPStartup, LPWSPSocketo LPWSPStringToAddress.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 2000 Professional [solo app desktop] |
server minimo supportato | Windows 2000 Server [solo app desktop] |
intestazione |
ws2spi.h |