Sockets partagés
La fonction WSADuplicateSocket est introduite pour activer le partage de sockets entre les processus. Un processus source appelle WSADuplicateSocket pour obtenir une structure de WSAPROTOCOL_INFO spéciale pour un identificateur de processus cible. 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é. 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.
Les deux descripteurs (ou plus) qui référencent un socket partagé peuvent être utilisés indépendamment en ce qui concerne les E/S. Toutefois, l’interface Winsock n’implémente aucun type de contrôle d’accès. Les processus doivent donc coordonner toutes les opérations sur un socket partagé. Un exemple classique de sockets de partage consiste à utiliser un processus pour créer des sockets et établir des connexions. Ce processus remet ensuite les sockets à d’autres processus responsables de l’échange d’informations.
La fonction WSADuplicateSocket crée des descripteurs de socket et non le socket sous-jacent. Par conséquent, tous les états associés à un socket sont conservés en commun sur tous les descripteurs. Par exemple, une opération de setsockopt effectuée à l’aide d’un descripteur est ensuite visible à l’aide d’un getsockopt à partir de n’importe quel descripteur ou de tous les descripteurs. Un processus peut appeler closesocket sur un socket en double et le descripteur devient désalloué. Toutefois, le socket sous-jacent reste ouvert jusqu’à ce que closesocket soit appelé avec le dernier descripteur restant.
La notification sur les sockets partagés est soumise aux contraintes habituelles des fonctionsWSAAsyncSelectet WSAEventSelect. 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, il n’est pas possible de traiter A recevoir des événements FD_READ et le processus B recevoir des événements FD_WRITE. 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.