Funzione WSADuplicateSocketA (winsock2.h)
La funzione WSADuplicateSocket
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 |
---|---|
Prima di usare questa funzione, è necessario eseguire una WSAStartup chiamata. | |
Il sottosistema di rete non è riuscito. | |
Indica che uno dei parametri specificati non è valido. | |
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure 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. | |
Il parametro lpProtocolInfo |
Osservazioni
La funzione WSADuplicateSocket
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
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 |