Condividi tramite


Funzione WSADuplicateSocketA (winsock2.h)

La funzione WSADuplicateSocket restituisce una struttura WSAPROTOCOL_INFO che può essere usata per creare un nuovo descrittore socket per un socket condiviso. La funzione WSADuplicateSocket non può essere usata in un socket abilitato per QOS.

Sintassi

int WSAAPI WSADuplicateSocketA(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);

Parametri

[in] s

Descrittore che identifica il socket locale.

[in] dwProcessId

Identificatore del processo di destinazione in cui verrà usato il socket duplicato.

[out] lpProtocolInfo

Puntatore a un buffer, allocato dal client, sufficientemente grande da contenere una struttura WSAPROTOCOL_INFO. Il provider di servizi copia il contenuto della struttura delle informazioni del protocollo in questo buffer.

Valore restituito

Se non si verifica alcun errore, WSADuplicateSocket restituisce zero. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando WSAGetLastError.

Codice di errore Significato
WSANOTINITIALISED
Prima di usare questa funzione, è necessario eseguire una WSAStartup chiamata.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Indica che uno dei parametri specificati non è valido.
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure 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.
WSAEFAULT
Il parametro lpProtocolInfo non è una parte valida dello spazio indirizzi utente.

Osservazioni

La funzione WSADuplicateSocket viene usata per abilitare la condivisione dei socket tra processi. Un processo di origine chiama WSADuplicateSocket 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 WSASocket per ottenere un descrittore per il socket duplicato. La struttura WSAPROTOCOL_INFO speciale può essere usata una sola volta dal processo di destinazione.

I socket possono essere condivisi tra thread in un determinato processo senza usare la funzione WSADuplicateSocket perché un descrittore socket è valido in tutti i thread di un processo.

Uno scenario possibile per stabilire e distribuire un socket condiviso è illustrato nella tabella seguente.

Processo di origine IPC Processo di destinazione
1) WSASocket, WSAConnect
2) Identificatore del processo di destinazione della richiesta ==>
3) Ricevere la richiesta di identificatore del processo e rispondere
4) Identificatore del processo di ricezione <==
5) Chiamare WSADuplicateSocket per ottenere una struttura WSAPROTOCOL_INFO speciale
6) Inviare WSAPROTOCOL_INFO struttura alla destinazione
==> 7) Struttura WSAPROTOCOL_INFO ricezione
8) Chiamare WSASocket per creare descrittore socket condiviso.
9) Usare socket condiviso per lo scambio di dati
10) closesocket <==
 

I descrittori che fanno riferimento a un socket condiviso possono essere usati in modo indipendente per 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. I socket condivisi vengono in genere usati per avere un processo responsabile della creazione di socket e della creazione di connessioni e di altri processi responsabili dello scambio di informazioni.

Tutte le informazioni sullo stato associate a un socket vengono mantenute in comune in tutti i descrittori perché i descrittori socket sono duplicati e non il socket effettivo. Ad esempio, un'operazione setockopt eseguita usando un descrittore viene successivamente visibile usando un getsockopt da qualsiasi descrittore o da tutti i descrittori. Sia il processo di origine che il processo di destinazione devono passare gli stessi flag ai rispettivi WSASocket chiamate di funzione. Se il processo di origine usa la funzione socket per creare il socket, il processo di destinazione deve passare il flag WSA_FLAG_OVERLAPPED al flag WSASocket chiamata di funzione. Un processo può chiamare closesocket su un socket duplicato e il descrittore diventerà deallocato. Il socket sottostante, tuttavia, rimarrà aperto fino a quando closesocket viene chiamato dall'ultimo descrittore rimanente.

La notifica sui socket condivisi è soggetta ai soliti vincoli di WSAAsyncSelect e WSAEventSelect. 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, un socket condiviso non può recapitare eventi FD_READ per elaborare gli eventi A e FD_WRITE per elaborare B. Per situazioni in cui è necessario un coordinamento così stretto, gli sviluppatori dovrebbero usare thread invece di processi separati.

windows 8.1 e Windows Server 2012 R2: la funzione WSADuplicateSocketW è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.

Nota

L'intestazione winsock2.h definisce WSADuplicateSocket come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice non indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere convenzioni di per i prototipi di funzioni.

Fabbisogno

Requisito Valore
client minimo supportato Windows 8.1, Windows Vista [app desktop | App UWP]
server minimo supportato Windows Server 2003 [app desktop | App UWP]
piattaforma di destinazione Finestre
intestazione winsock2.h
libreria Ws2_32.lib
dll Ws2_32.dll

Vedere anche

WSASocket

Funzioni Winsock

di riferimento winsock