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 WSAPROTOCOL_INFO spéciale. Il utilise un mécanisme de communication interprocesseur (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 à un socket sous-jacent qui devient ainsi partagé.
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 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 multithread multithread monothread monothread et préemptives 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 aux fournisseurs IFS doivent appeler WPUModifyIFSHandle et non-IFS doivent appeler WPUCreateSocketHandle.
Un scénario possible pour établir et utiliser un socket partagé en mode transfert est illustré dans le tableau suivant.
Processus source | IPC | Processus de destination |
---|---|---|
1) WSPSocket, WSPConnect | ||
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 WSPDuplicateSocket pour obtenir une structure 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 | <== |