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