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 |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. | |
Le sous-système réseau a échoué. | |
Indique qu’un des paramètres spécifiés n’était pas valide. | |
Un appel Windows Sockets 1.1 bloquant est en cours, ou le fournisseur de services traite toujours une fonction de rappel. | |
Plus aucun descripteur de socket n’est disponible. | |
Aucun espace tampon n’est disponible. Impossible de créer le socket. | |
Le descripteur n’est pas un socket. | |
Le paramètre |
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
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 |