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 WSAPROTOCOL_INFO spéciale pour un identificateur de processus cible. 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é. 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 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 communs à tous les descripteurs. Par exemple, une opération setsockopt effectuée à l’aide d’un descripteur est ensuite visible à l’aide d’un getsockopt à partir d’un ou de tous les descripteurs. Un processus peut appeler closesocket sur un socket dupliqué et le descripteur sera libéré. 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 fonctions WSAsyncSelect et 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 ne serait pas possible de recevoir les événements A FD_READ et B de recevoir des événements FD_WRITE. 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.