Freigeben über


Freigegebene Sockets

Die WSADuplicateSocket-Funktion wird eingeführt, um die prozessübergreifende Socketfreigabe zu ermöglichen. Ein Quellprozess ruft WSADuplicateSocket auf, um eine spezielle WSAPROTOCOL_INFO-Struktur für einen Zielprozessbezeichner zu erhalten. Es verwendet einen IPC-Mechanismus (Interprocess Communications), 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 somit 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 beiden (oder mehr) Deskriptoren, die auf einen freigegebenen Socket verweisen, können unabhängig voneinander verwendet werden, was E/A betrifft. Die Winsock-Schnittstelle implementiert jedoch keine Zugriffssteuerung, sodass die Prozesse alle Vorgänge für einen freigegebenen Socket koordinieren müssen. Ein typisches Beispiel für die Gemeinsame Nutzung von Sockets ist die Verwendung eines Prozesses zum Erstellen von Sockets und Herstellen von Verbindungen. Dieser Prozess übergibt dann Sockets an andere Prozesse, die für den Informationsaustausch verantwortlich sind.

Die WSADuplicateSocket-Funktion erstellt Socketdeskriptoren und nicht den zugrunde liegenden Socket. Daher sind alle Zustände, die einem Socket zugeordnet sind, in allen Deskriptoren gemeinsam. Beispielsweise ist ein setockopt-Vorgang , der mit einem Deskriptor ausgeführt wird, anschließend mithilfe eines getsockopt-Vorgangs von einem oder allen Deskriptoren sichtbar. Ein Prozess kann closesocket für einen duplizierten Socket aufrufen, und die Zuordnung des Deskriptors wird aufgehoben. 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 ausführen, wird jede vorherige Ereignisregistrierung für den Socket abgebrochen, unabhängig davon, welcher Deskriptor für die Registrierung verwendet wurde. So wäre es beispielsweise nicht möglich, dass Prozess A FD_READ Ereignisse empfängt und Prozess B FD_WRITE Ereignisse empfängt. Für Situationen, in denen eine solche enge Koordination erforderlich ist, wird empfohlen, dass Entwickler Threads anstelle separater Prozesse verwenden.