Freigegebene Sockets
Die WSADuplicateSocket-Funktion wurde eingeführt, um die Freigabe von Sockets über Prozesse hinweg zu ermöglichen. Ein Quellprozess ruft WSADuplicateSocket auf, um eine spezielle WSAPROTOCOL _ INFO-Struktur für einen Zielprozessbezeichner abzurufen. Dabei wird ein IPC-Mechanismus (Interprocess Communications) verwendet, um den Inhalt dieser Struktur an einen Zielprozess zu übergeben. Der Zielprozess verwendet dann die WSAPROTOCOL _ INFO-Struktur in einem Aufruf von WSPSocket. Der von dieser Funktion zurückgegebene Socketdeskriptor ist ein zusätzlicher Socketdeskriptor für einen zugrunde liegenden Socket, der daher freigegeben wird. Sockets können für Threads in einem bestimmten Prozess freigegeben werden, ohne die WSADuplicateSocket-Funktion zu verwenden, da ein Socketdeskriptor in allen Threads eines Prozesses gültig ist.
Die zwei (oder mehr) Deskriptoren, die auf einen freigegebenen Socket verweisen, können unabhängig von E/A verwendet werden. Die Winsock-Schnittstelle implementiert jedoch keine Art von Zugriffssteuerung, sodass die Prozesse alle Vorgänge für einen freigegebenen Socket koordinieren müssen. Ein typisches Beispiel für die Freigabe von Sockets ist die Verwendung eines Prozesses zum Erstellen von Sockets und Herstellen von Verbindungen. Dieser Prozess übergibt sockets dann an andere Prozesse, die für den Informationsaustausch verantwortlich sind.
Die WSADuplicateSocket-Funktion erstellt Socketdeskriptoren und nicht den zugrunde liegenden Socket. Daher werden alle einem Socket zugeordneten Zustände für alle Deskriptoren gemeinsam gehalten. Beispielsweise wird ein Setockopt-Vorgang, der mit einem Deskriptor ausgeführt wird, anschließend mit einem Getsockopt von einem oder allen Deskriptoren angezeigt. Ein Prozess kann closesocket für einen duplizierten Socket aufrufen, und die Zuordnung des Deskriptors wird freigegeben. Der zugrunde liegende Socket bleibt jedoch geöffnet, bis closesocket mit dem letzten verbleibenden Deskriptor aufgerufen wird.
Die Benachrichtigung für freigegebene Sockets unterliegt den üblichen Einschränkungen der Funktionen WSAAsyncSelect und WSAEventSelect. Wenn Sie einen dieser Aufrufe mit einem der freigegebenen Deskriptoren ausgeben, werden alle vorherigen Ereignisregistrierungen für den Socket abgebrochen, unabhängig davon, welcher Deskriptor für diese Registrierung verwendet wurde. Daher wäre es beispielsweise nicht möglich, dass Prozess A FD READ-Ereignisse empfängt _ und Prozess B FD _ WRITE-Ereignisse empfängt. In Situationen, in denen eine solche enge Koordination erforderlich ist, wird empfohlen, dass Entwickler Threads anstelle separater Prozesse verwenden.