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
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Indica che uno dei parametri specificati non è valido.
WSAEINPROGRESS
Il blocco della chiamata a Windows Sockets è in corso o il provider di servizi sta ancora elaborando una funzione di callback.
WSAEMFILE
Non sono disponibili altri descrittori socket.
WSAENOBUFS
Non è disponibile alcuno spazio nel buffer. Impossibile creare il socket.
WSAENOTSOCK
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 . Per garantire un'esecuzione corretta della duplicazione socket, un provider di servizi non IFS deve usare la funzione LPWSPDuplicateSocket .

Uno scenario possibile per stabilire e usare un socket condiviso in modalità handoff è illustrato di seguito.

Processo di origine IPC Significato
1) LPWSPSocket, LPWSPConnect
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 **LPWSPDuplicateSocket** per ottenere una struttura WSAPROTOCOL_INFO speciale.
6) Invia WSAPROTOCOL_INFO struttura alla destinazione.
==> 7) Riceve WSAPROTOCOL_INFO struttura.
8) Chiama LPWSPSocket per creare descrittore socket condiviso.
9) Usa socket condiviso per lo scambio di dati.
10) LPWSPCloseSocket
<==

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 eseguita usando un descrittore viene successivamente visibile usando un LPWSPGetSockopt da qualsiasi descrittore o da tutti i descrittori. Un processo può chiamare LPWSPCloseSocket su un socket duplicato e il descrittore diventerà deallocato. Il socket sottostante, tuttavia, rimarrà aperto fino a LPWSPClosesocket viene chiamato dall'ultimo descrittore rimanente.

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

Vedere anche

WPUCreateSocketHandle

WPUModifyIFSHandle