Share via


Fonction de rappel LPWSPDUPLICATESOCKET (ws2spi.h)

La fonction LPWSPDuplicateSocket retourne une structure WSAPROTOCOL_INFO qui peut être utilisée pour créer un descripteur de socket pour un socket partagé.

Syntaxe

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

Paramètres

[in] s

Descripteur de socket local.

[in] dwProcessId

Identificateur du processus cible pour lequel le socket partagé sera utilisé.

[out] lpProtocolInfo

Pointeur vers une mémoire tampon allouée par le client qui est 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.

[out] lpErrno

Pointeur vers le code d’erreur.

Valeur retournée

Si aucune erreur ne se produit, LPWSPDuplicateSocket retourne zéro. Sinon, la valeur de SOCKET_ERROR est retournée et un numéro d’erreur spécifique est disponible dans lpErrno.

Code d'erreur Signification
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
Le blocage de l’appel Windows Sockets 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.

Remarques

Un processus source appelle LPWSPDuplicateSocket pour obtenir une structure de WSAPROTOCOL_INFO spéciale. Il utilise un mécanisme de communications interprocessus (IPC) pour transmettre le contenu de cette structure à un processus cible, qui l’utilise à son tour dans un appel à LPWSPSocket pour obtenir un descripteur pour le socket dupliqué. Notez que la structure de WSAPROTOCOL_INFO spéciale ne peut être utilisée qu’une seule fois par le processus cible.

Il incombe au fournisseur de services d’effectuer toutes les opérations nécessaires dans le contexte du processus source et de créer une structure de WSAPROTOCOL_INFO qui sera reconnue lorsqu’elle apparaîtra ultérieurement en tant que paramètre pour LPWSPSocket dans le contexte des processus cibles. Le fournisseur doit ensuite retourner un descripteur de socket qui fait référence à un socket sous-jacent commun. Le membre dwProviderReserved de la structure WSAPROTOCOL_INFO est disponible pour l’utilisation du fournisseur de services et peut être utilisé pour stocker toutes les informations de contexte utiles, y compris un handle dupliqué.

Lorsqu’un nouveau descripteur de socket est alloué, un fournisseur de système de fichiers installable (IFS) doit appeler WPUModifyIFSHandle, et un fournisseur non-IFS doit appeler WPUCreateSocketHandle. Un fournisseur IFS peut utiliser la fonction DuplicateHandle . Pour garantir l’exécution correcte de la duplication de sockets, un fournisseur de services non-IFS doit utiliser la fonction LPWSPDuplicateSocket .

L’un des scénarios possibles d’établissement et d’utilisation d’un socket partagé en mode de transfert est illustré ci-dessous.

Processus source IPC Signification
1) LPWSPSocket, LPWSPConnect
2) Identificateur de processus cible des demandes.
==>
3) Reçoit la demande d’identificateur de processus et répond.
4) Reçoit l’identificateur de processus.
<==
5) Appelle **LPWSPDuplicateSocket** pour obtenir une structure de WSAPROTOCOL_INFO spéciale.
6) Envoie WSAPROTOCOL_INFO structure à la cible.
==> 7) Reçoit WSAPROTOCOL_INFO structure.
8) Appelle LPWSPSocket pour créer un descripteur de socket partagé.
9) Utilise le socket partagé pour l’échange de données.
10) LPWSPCloseSocket
<==

Les descripteurs qui référencent un socket partagé peuvent être utilisés indépendamment en ce qui concerne les E/S. Toutefois, l’interface Windows Sockets n’implémente aucun type de contrôle d’accès, c’est donc aux processus impliqués de coordonner leurs opérations sur un socket partagé. Une utilisation classique des sockets partagés consiste à avoir un processus chargé de créer des sockets et d’établir des connexions, de remettre les sockets à d’autres processus responsables de l’échange d’informations.

Étant donné que ce qui est dupliqué sont les descripteurs de socket et non le socket sous-jacent, tous les états associés à un socket sont conservés en commun sur tous les descripteurs. Par exemple, une opération WSPSetSockOpt effectuée à l’aide d’un descripteur est ensuite visible à l’aide d’un LPWSPGetSockopt à partir d’un ou de tous les descripteurs. Un processus peut appeler LPWSPCloseSocket sur un socket dupliqué et le descripteur sera libéré. Toutefois, le socket sous-jacent reste ouvert jusqu’à ce que LPWSPClosesocket soit appelé par le dernier descripteur restant.

La notification sur les sockets partagés est soumise aux contraintes habituelles de LPWSPAsyncSelect et LPWSPEventSelect. 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. Ainsi, par exemple, un socket partagé ne peut pas remettre FD_READ événements pour traiter A et FD_WRITE événements pour traiter B. Pour les situations où une coordination aussi étroite est requise, il est recommandé aux développeurs d’utiliser des threads au lieu de processus distincts.

Un fournisseur de services en couches fournit une implémentation de cette fonction, mais il est également un client de cette fonction si et quand il appelle LPWSPDuplicateSocket de la couche suivante dans la chaîne de protocole. Certaines considérations particulières s’appliquent au paramètre lpProtocolInfo de cette fonction, car il est propagé vers le bas dans les couches de la chaîne de protocole.

Si la couche suivante de la chaîne de protocole est une autre couche, lorsque le LPWSPDuplicateSocket de la couche suivante est appelé, cette couche doit passer à la couche suivante un lpProtocolInfo qui référence la même structure de WSAPROTOCOL_INFO non modifiée avec les mêmes informations de chaîne non modifiées. Toutefois, si la couche suivante est le protocole de base (c’est-à-dire le dernier élément de la chaîne), cette couche effectue une substitution lors de l’appel du LPWSPDuplicateSocket du fournisseur de base. Dans ce cas, la structure WSAPROTOCOL_INFO du fournisseur de base doit être référencée par le paramètre lpProtocolInfo .

L’un des avantages essentiels de cette stratégie est que les fournisseurs de services de base n’ont pas à connaître les chaînes de protocoles. Cette même stratégie s’applique lors de la propagation d’une structure de WSAPROTOCOL_INFO via une séquence en couches d’autres fonctions telles que LPWSPAddressToString, WSPStartup, LPWSPSocket ou LPWSPStringToAddress.

Spécifications

   
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
En-tête ws2spi.h

Voir aussi

WPUCreateSocketHandle

WPUModifyIFSHandle