Partager via


WSADuplicateSocketW, fonction (winsock2.h)

La fonction WSADuplicateSocket retourne une structure WSAPROTOCOL_INFO qui peut être utilisée pour créer un descripteur de socket pour un socket partagé. La fonction WSADuplicateSocket ne peut pas être utilisée sur un socket compatible QOS.

Syntaxe

int WSAAPI WSADuplicateSocketW(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo
);

Paramètres

[in] s

Descripteur identifiant le socket local.

[in] dwProcessId

Identificateur de processus du processus cible dans lequel le socket dupliqué sera utilisé.

[out] lpProtocolInfo

Pointeur vers une mémoire tampon, allouée par le client, suffisamment grande pour contenir une structure WSAPROTOCOL_INFO. Le fournisseur de services copie le contenu de la structure des informations du protocole dans cette mémoire tampon.

Valeur de retour

Si aucune erreur ne se produit, WSADuplicateSocket retourne zéro. Sinon, une valeur de SOCKET_ERROR est retournée et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

Code d’erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEINVAL
Indique qu’un des paramètres spécifiés n’était pas valide.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant est en cours, ou le fournisseur de services traite toujours une fonction de rappel.
WSAEMFILE
Plus aucun descripteur de socket n’est disponible.
WSAENOBUFS
Aucun espace tampon n’est disponible. Impossible de créer le socket.
WSAENOTSOCK
Le descripteur n’est pas un socket.
WSAEFAULT
Le paramètre lpProtocolInfo n’est pas une partie valide de l’espace d’adressage utilisateur.

Remarques

La fonction WSADuplicateSocket est utilisée pour activer le partage de sockets entre les processus. Un processus source appelle WSADuplicateSocket pour obtenir une structure WSAPROTOCOL_INFO spéciale. Il utilise un mécanisme de communication interprocesseur (IPC) pour transmettre le contenu de cette structure à un processus cible, qui l’utilise à son tour dans un appel à WSASocket pour obtenir un descripteur pour le socket en double. La structure de WSAPROTOCOL_INFO spéciale ne peut être utilisée qu’une seule fois par le processus cible.

Les sockets peuvent être partagés entre des threads dans un processus donné sans utiliser la fonction WSADuplicateSocket, car un descripteur de socket est valide dans tous les threads d’un processus.

Un scénario possible d’établissement et de remise d’un socket partagé est illustré dans le tableau suivant.

Processus source IPC Processus de destination
1) WSASocket , WSAConnect
2) Identificateur de processus cible de demande ==>
3) Recevoir la demande d’identificateur de processus et répondre
4) Identificateur de processus de réception <==
5) Appeler WSADuplicateSocket pour obtenir une structure WSAPROTOCOL_INFO spéciale
6) Envoyer WSAPROTOCOL_INFO structure à la cible
==> 7) Structure de réception WSAPROTOCOL_INFO
8) Appelez WSASocket pour créer un descripteur de socket partagé.
9) Utiliser le socket partagé pour l’échange de données
10) closesocket <==
 

Les descripteurs qui référencent un socket partagé peuvent être utilisés indépendamment pour les E/S. Toutefois, l’interface Windows Sockets n’implémente aucun type de contrôle d’accès. Il incombe donc aux processus impliqués de coordonner leurs opérations sur un socket partagé. Les sockets partagés sont généralement utilisés pour avoir un processus chargé de créer des sockets et d’établir des connexions, et d’autres processus responsables de l’échange d’informations.

Toutes les informations d’état associées à un socket sont conservées en commun sur tous les descripteurs, car les descripteurs de socket sont dupliqués et non le socket réel. Par exemple, une opération de setsockopt effectuée à l’aide d’un descripteur est ensuite visible à l’aide d’un getsockopt d’un ou de tous les descripteurs. Le processus source et le processus de destination doivent passer les mêmes indicateurs à leurs appels de fonction WSASock et respectifs WSASocket. Si le processus source utilise la fonction socket pour créer le socket, le processus de destination doit passer l’indicateur WSA_FLAG_OVERLAPPED à son appel de fonction WSASocket . Un processus peut appeler closesocket sur un socket en double et le descripteur devient désalloué. Toutefois, le socket sous-jacent reste ouvert jusqu’à ce que closesocket soit appelé par le dernier descripteur restant.

La notification sur les sockets partagés est soumise aux contraintes habituelles de WSAAsyncSelect et WSAEventSelect. L’émission de l’un de ces appels à l’aide de l’un des descripteurs partagés annule toute inscription d’événement précédente pour le socket, quel que soit le descripteur utilisé pour effectuer cette inscription. Par conséquent, un socket partagé ne peut pas remettre FD_READ événements pour traiter A et FD_WRITE des événements au processus B. Dans les cas où une coordination aussi étroite est requise, les développeurs sont invités à utiliser des threads au lieu de processus distincts.

Windows 8.1 et Windows Server 2012 R2: la fonction WSADuplicateSocketW est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

Note

L’en-tête winsock2.h définit WSADuplicateSocket comme alias qui sélectionne automatiquement la version ANSI ou Unicode de cette fonction en fonction de la définition de la constante de préprocesseur UNICODE. Le mélange de l’utilisation de l’alias neutre en encodage avec du code qui n’est pas neutre en encodage peut entraîner des incompatibilités qui entraînent des erreurs de compilation ou d’exécution. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.

Exigences

Exigence Valeur
client minimum pris en charge Windows 8.1, Windows Vista [applications de bureau | Applications UWP]
serveur minimum pris en charge Windows Server 2003 [applications de bureau | Applications UWP]
plateforme cible Windows
d’en-tête winsock2.h
bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSASocket

fonctions Winsock

de référence Winsock