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 è possibile recuperare un codice di errore specifico chiamando WSAGetLastError.

Codice di errore Significato
WSANOTINITIALISED
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita.
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
Descrittori di socket esauriti.
WSAENOBUFS
Nessuno spazio di buffer disponibile. Impossibile creare il socket.
WSAENOTSOCK
Il descrittore non è un socket.
WSAEFAULT
Il parametro lpProtocolInfo non è una parte valida dello spazio indirizzi utente.

Commenti

La funzione WSADuplicateSocket viene usata per abilitare la condivisione dei socket tra i processi. Un processo di origine chiama WSADuplicateSocket per ottenere una struttura di 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 speciale WSAPROTOCOL_INFO può essere utilizzata 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) Richiesta e risposta dell'identificatore del processo di ricezione
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 il 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, pertanto 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 setsockopt eseguita usando un descrittore è successivamente visibile usando un oggetto getsockopt da qualsiasi descrittore o da tutti i descrittori. Sia il processo di origine che il processo di destinazione devono passare gli stessi flag alle rispettive chiamate di funzione WSASocket . Se il processo di origine usa la funzione socket per creare il socket, il processo di destinazione deve passare il flag di WSA_FLAG_OVERLAPPED alla chiamata di funzione WSASocket . Un processo può chiamare closesocket su un socket duplicato e il descrittore diventerà deallocato. Il socket sottostante, tuttavia, rimarrà aperto fino a quando closesocket non viene chiamato dall'ultimo descrittore rimanente.

La notifica sui socket condivisi è soggetta ai normali vincoli di WSAAsyncSelect e WSAEventSelect. L'esecuzione di una di queste chiamate utilizzando uno dei descrittori condivisi annulla qualsiasi registrazione dell'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 anziché 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 che non è indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzioni.

Requisiti

   
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 Windows
Intestazione winsock2.h
Libreria Ws2_32.lib
DLL Ws2_32.dll

Vedi anche

WSASocket

Funzioni Winsock

Informazioni di riferimento su Winsock