WSADuplicateSocketA, 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 WSADuplicateSocketA(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOA 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 d’informations de protocole dans cette mémoire tampon.

Valeur retournée

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 que l’un des paramètres spécifiés n’était pas valide.
WSAEINPROGRESS
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEMFILE
Aucun descripteur de socket supplémentaire n'est disponible.
WSAENOBUFS
Aucune zone tampon 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 interprocessus (IPC) pour transmettre le contenu de cette structure à un processus cible, qui à son tour l’utilise dans un appel à WSASocket pour obtenir un descripteur pour le socket dupliqué. La structure 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) Appelez WSADuplicateSocket pour obtenir une structure WSAPROTOCOL_INFO spéciale
6) Envoyer WSAPROTOCOL_INFO structure à la cible
==> 7) Structure de WSAPROTOCOL_INFO de réception
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, ainsi que d’autres processus responsables de l’échange d’informations.

Toutes les informations d’état associées à un socket sont conservées en commun dans tous les descripteurs, car les descripteurs de socket sont dupliqués et non le socket réel. Par exemple, une opération setsockopt effectuée à l’aide d’un descripteur est ensuite visible à l’aide d’un getockopt à partir 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 WSASocket respectifs. 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 dupliqué et le descripteur sera libéré. 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 d’un de ces appels à l’aide d’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 fournir FD_READ événements pour traiter A et FD_WRITE événements au traitement B. Pour les situations où une coordination aussi étroite est requise, il est conseillé aux développeurs d’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.

Notes

L’en-tête winsock2.h définit WSADuplicateSocket comme un 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.

Configuration requise

   
Client minimal pris en charge Windows 8.1, Windows Vista [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winsock2.h
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSASocket

Fonctions Winsock

Informations de référence sur Winsock