Partager 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 suffisamment grand 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.

[out] lpErrno

Pointeur vers le code d’erreur.

Valeur de retour

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 qu’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
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.

Remarques

Un processus source appelle LPWSPDuplicateSocket pour obtenir une structure WSAPROTOCOL_INFO spéciale. Il utilise un mécanisme de communication interprocess (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 en double. 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 les opérations nécessaires dans le contexte du processus source et de créer une structure WSAPROTOCOL_INFO qui sera reconnue par la suite comme 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 dwProviderReserved membre 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 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 appropriée de la duplication de sockets, un fournisseur de services non-IFS doit utiliser la fonction LPWSPDuplicateSocket.

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

Processus source IPC Signification
1) LPWSPSocket, LPWSPConnect
2) Demande l’identificateur du processus cible.
==>
3) Reçoit la demande d’identificateur de processus et répond.
4) Reçoit l’identificateur du processus.
<==
5) Appelle **LPWSPDuplicateSocket** pour obtenir une structure 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. Il incombe donc aux processus impliqués de coordonner leurs opérations sur un socket partagé. Une utilisation classique pour les sockets partagés consiste à avoir un processus chargé de créer des sockets et d’établir des connexions, de remettre des sockets à d’autres processus responsables de l’échange d’informations.

Étant donné que ce qui est dupliqué est 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 de n’importe quel descripteur ou de tous les descripteurs. Un processus peut appeler LPWSPCloseSocket sur un socket en double et le descripteur devient désalloué. Toutefois, le socket sous-jacent reste ouvert jusqu’à LPWSPClosesocket est 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. 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 suggéré que les développeurs utilisent 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 elle appelle LPWSPDuplicateSocket de la couche suivante dans la chaîne de protocole. Certaines considérations spéciales s’appliquent au paramètre lpProtocolInfo de cette fonction, car il est propagé à travers les couches de la chaîne de protocole.

Si la couche suivante de la chaîne de protocole est une autre couche, lorsque la couche suivante LPWSPDuplicateSocket est appelée, cette couche doit passer à la couche suivante une lpProtocolInfo qui fait référence à la même structure 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 (autrement dit, 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 protocole. Cette même stratégie s’applique lors de la propagation d’une structure de WSAPROTOCOL_INFO via une séquence superposée d’autres fonctions telles que LPWSPAddressToString, WSPStartup, LPWSPSocketou LPWSPStringToAddress.

Exigences

Exigence Valeur
client minimum pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
serveur minimum pris en charge Windows 2000 Server [applications de bureau uniquement]
d’en-tête ws2spi.h

Voir aussi

WPUCreateSocketHandle

WPUModifyIFSHandle