Share via


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 abbastanza grande 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, il valore di SOCKET_ERROR viene restituito e un numero di errore specifico è disponibile in lpErrno.

Codice di 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
Descrittori di socket esauriti.
WSAENOBUFS
Nessuno spazio di buffer disponibile. Impossibile creare il socket.
WSAENOTSOCK
Il descrittore non è un socket.

Commenti

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 speciale WSAPROTOCOL_INFO può essere usata una sola volta dal processo di destinazione.

È 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 LPWSPSocket nel contesto dei processi di destinazione. Il provider deve quindi restituire un descrittore socket che fa riferimento a un socket sottostante comune. 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.

Quando viene allocato un nuovo descrittore socket, un provider IFS (Installable File System) deve chiamare WPUModifyIFSHandle e un provider non IFS deve chiamare WPUCreateSocketHandle. Un provider IFS può usare la funzione DuplicateHandle . Per garantire l'esecuzione corretta della duplicazione del 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 di 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 un descrittore socket condiviso.
9) Usa il 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 l'I/O. Tuttavia, l'interfaccia Windows Sockets non implementa alcun tipo di controllo di accesso, pertanto è necessario che i processi coinvolti coordinano 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, passare i socket ad altri processi responsabili dello scambio di informazioni.

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

La notifica nei socket condivisi è soggetta ai vincoli consueti di LPWSPAsyncSelect e LPWSPEventSelect. L'emissione di una di queste chiamate usando uno dei descrittori condivisi annulla qualsiasi registrazione evento precedente per il socket, indipendentemente dal descrittore usato per effettuare tale registrazione. Ad esempio, un socket condiviso non può recapitare eventi FD_READ per elaborare eventi A e FD_WRITE per elaborare B. Per situazioni in cui è necessario un coordinamento stretto, è consigliabile che gli sviluppatori usino thread anziché processi separati.

Un provider di servizi a 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 della funzione perché viene propagato verso il basso attraverso i livelli della catena di protocolli.

Se il livello successivo della catena di protocolli è un altro livello, quando viene chiamato LPWSPDuplicateSocket del livello successivo, 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 LPWSPDuplicateSocket del provider di base. In questo caso, la struttura di WSAPROTOCOL_INFO del provider di base deve essere a cui fa riferimento il parametro lpProtocolInfo .

Un vantaggio fondamentale di questa politica è 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 livelli di altre funzioni, ad esempio LPWSPAddressToString, WSPStartup, LPWSPSocket o LPWSPStringToAddress.

Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Intestazione ws2spi.h

Vedi anche

WPUCreateSocketHandle

WPUModifyIFSHandle