Sockets partagés dans le SPI
Le partage de sockets entre les processus dans Windows Sockets est implémenté comme suit. Un processus source appelle WSPDuplicateSocket 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. Le processus cible utilise ensuite la structure WSAPROTOCOL_INFO dans un appel à WSPSocket. Le descripteur de socket retourné par cette fonction sera un descripteur de socket supplémentaire pour un socket sous-jacent qui devient ainsi partagé.
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 WSAPROTOCOL_INFO qui sera reconnue lorsqu’elle apparaîtra ultérieurement en tant que paramètre pour WSPSocket dans le contexte des processus cibles. 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é.
Ce mécanisme est conçu pour être approprié pour les versions monothread et préemptives multithread de Windows. Notez toutefois que les sockets peuvent être partagés entre des threads dans un processus donné sans utiliser la fonction WSPDuplicateSocket , car un descripteur de socket est valide dans tous les threads d’un processus.
Comme décrit dans la section Allocation de descripteur, lorsque de nouveaux descripteurs de socket sont alloués, les fournisseurs IFS doivent appeler WPUModifyIFSHandle et les fournisseurs non-IFS doivent appeler WPUCreateSocketHandle.
Un scénario possible d’établissement et d’utilisation d’un socket partagé en mode transfert est illustré dans le tableau suivant.
Processus source | IPC | Processus de destination |
---|---|---|
1) WSPSocket, WSPConnect | ||
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 WSPDuplicateSocket pour obtenir une structure de WSAPROTOCOL_INFO spéciale. | ||
6) Envoie WSAPROTOCOL_INFO structure à la cible. | ||
==> | 7) Reçoit WSAPROTOCOL_INFO structure. | |
8) Appelle WSPSocket pour créer un descripteur de socket partagé. | ||
9)Utilise le socket partagé pour l’échange de données. | ||
10) WSPClosesocket | <== |