Freigeben über


Freigegebene Sockets

Die WSADuplicateSocket--Funktion wird eingeführt, um die Socketfreigabe über Prozesse hinweg zu ermöglichen. Ein Quellprozess ruft WSADuplicateSocket- auf, um eine spezielle WSAPROTOCOL_INFO Struktur für einen Zielprozessbezeichner abzurufen. Es verwendet einen Mechanismus für die Interprocess-Kommunikation (INTERprocess Communications, IPC), um den Inhalt dieser Struktur an einen Zielprozess zu übergeben. Der Zielprozess verwendet dann die WSAPROTOCOL_INFO Struktur in einem Aufruf 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, soweit E/A betroffen ist. Die Winsock-Schnittstelle implementiert jedoch keinen Zugriffssteuerungstyp, sodass die Prozesse alle Vorgänge in einem freigegebenen Socket koordinieren müssen. Ein typisches Beispiel für die Freigabe von Sockets besteht darin, einen Prozess zum Erstellen von Sockets und zum Herstellen von Verbindungen zu verwenden. 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 werden alle mit einem Socket verbundenen Zustände in allen Deskriptoren gemeinsam gehalten. Beispielsweise wird ein setockopt- Vorgang, der mit einem Deskriptor ausgeführt wird, anschließend mithilfe eines getsockopt von beliebigen oder allen Deskriptoren sichtbar. Ein Prozess kann Closesocket- in einem duplizierten Socket aufrufen, und der Deskriptor wird umgestellt. 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 WSAAsyncSelect- und WSAEventSelect--Funktionen. Durch das Ausgeben einer dieser Aufrufe mit einem der freigegebenen Deskriptoren wird jede vorherige Ereignisregistrierung für den Socket abgebrochen, unabhängig davon, welcher Deskriptor für diese Registrierung verwendet wurde. So wäre es z. B. nicht möglich, prozess A empfangen FD_READ Ereignisse und Prozess B FD_WRITE Ereignisse zu empfangen. In Situationen, in denen eine solche enge Koordination erforderlich ist, wird empfohlen, dass Entwickler Threads anstelle separater Prozesse verwenden.