Freigeben über


WSADuplicateSocketW-Funktion (winsock2.h)

Die WSADuplicateSocket--Funktion gibt eine WSAPROTOCOL_INFO Struktur zurück, die zum Erstellen eines neuen Socketdeskriptors für einen freigegebenen Socket verwendet werden kann. Die WSADuplicateSocket--Funktion kann nicht für einen QOS-fähigen Socket verwendet werden.

Syntax

int WSAAPI WSADuplicateSocketW(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo
);

Parameter

[in] s

Deskriptor, der den lokalen Socket identifiziert.

[in] dwProcessId

Prozessbezeichner des Zielprozesses, in dem der duplizierte Socket verwendet wird.

[out] lpProtocolInfo

Zeiger auf einen Puffer, der vom Client zugewiesen ist, der groß genug ist, um eine WSAPROTOCOL_INFO Struktur zu enthalten. Der Dienstanbieter kopiert den Inhalt der Protokollinformationsstruktur in diesen Puffer.

Rückgabewert

Wenn kein Fehler auftritt, gibt WSADuplicateSocket Null zurück. Andernfalls wird ein Wert von SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen WSAGetLastErrorabgerufen werden.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Ein erfolgreicher WSAStartup Aufrufs muss erfolgen, bevor diese Funktion verwendet wird.
WSAENETDOWN-
Fehler des Netzwerksubsystems.
WSAEINVAL-
Gibt an, dass einer der angegebenen Parameter ungültig war.
WSAEINPROGRESS-
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEMFILE-
Es sind keine weiteren Socketdeskriptoren verfügbar.
WSAENOBUFS
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht erstellt werden.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEFAULT-
Der parameter lpProtocolInfo ist kein gültiger Teil des Benutzeradressraums.

Bemerkungen

Die WSADuplicateSocket--Funktion wird verwendet, um die Socketfreigabe zwischen Prozessen zu ermöglichen. Ein Quellprozess ruft WSADuplicateSocket- auf, um eine spezielle WSAPROTOCOL_INFO-Struktur zu erhalten. Es verwendet einen Mechanismus für die Interprocess Communications (IPC), um den Inhalt dieser Struktur an einen Zielprozess zu übergeben, der ihn wiederum in einem Aufruf von WSASocket- verwendet, um einen Deskriptor für den duplizierten Socket abzurufen. Die spezielle WSAPROTOCOL_INFO-Struktur kann nur einmal vom Zielprozess verwendet werden.

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.

Ein mögliches Szenario für die Einrichtung und Übergabe eines freigegebenen Sockets ist in der folgenden Tabelle dargestellt.

Quellprozess IPC Zielprozess
1) WSASocket-, WSAConnect-
2) Anforderungszielprozess-ID ==>
3) Empfangen einer Prozess-ID-Anforderung und -Antwort
4) Empfangsprozess-ID <==
5) Rufen Sie WSADuplicateSocket- auf, um eine spezielle WSAPROTOCOL_INFO Struktur zu erhalten
6) WSAPROTOCOL_INFO Struktur an Ziel senden
==> 7) Empfangen WSAPROTOCOL_INFO Struktur
8) Rufen Sie WSASocket- auf, um einen freigegebenen Socketdeskriptor zu erstellen.
9) Gemeinsame Sockets für den Datenaustausch verwenden
10) closesocket <==
 

Die Deskriptoren, die auf einen freigegebenen Socket verweisen, können unabhängig für E/A verwendet werden. Die Windows Sockets-Schnittstelle implementiert jedoch keinen Zugriffssteuerungstyp, sodass es an den beteiligten Prozessen liegt, ihre Vorgänge in einem freigegebenen Socket zu koordinieren. Freigegebene Sockets werden in der Regel verwendet, um einen Prozess zu verwenden, der für das Erstellen von Sockets und das Herstellen von Verbindungen verantwortlich ist, sowie andere Prozesse, die für den Informationsaustausch verantwortlich sind.

Alle Statusinformationen, die einem Socket zugeordnet sind, werden in allen Deskriptoren gemeinsam gespeichert, da die Socketdeskriptoren dupliziert und nicht der tatsächliche Socket. Beispielsweise wird ein setockopt- Vorgang, der mit einem Deskriptor ausgeführt wird, anschließend mithilfe eines getsockopt von beliebigen oder allen Deskriptoren sichtbar. Sowohl der Quellprozess als auch der Zielprozess sollten dieselben Flags an die jeweiligen WSASocket- Funktionsaufrufe übergeben. Wenn der Quellprozess die Socket--Funktion zum Erstellen des Sockets verwendet, muss der Zielprozess das WSA_FLAG_OVERLAPPED Flag an den WSASocket- Funktionsaufruf übergeben. Ein Prozess kann Closesocket- in einem duplizierten Socket aufrufen, und der Deskriptor wird zu einer Zuordnung. Der zugrunde liegende Socket bleibt jedoch geöffnet, bis closesocket- vom letzten verbleibenden Deskriptor aufgerufen wird.

Die Benachrichtigung für freigegebene Sockets unterliegt den üblichen Einschränkungen von WSAAsyncSelect- und WSAEventSelect-. 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. Daher kann ein freigegebener Socket keine FD_READ Ereignisse zum Verarbeiten von A- und FD_WRITE Ereignissen zum Verarbeiten von B liefern. Für Situationen, in der eine solche enge Koordination erforderlich ist, würden Entwickler empfohlen, Threads anstelle separater Prozesse zu verwenden.

Windows 8.1 und Windows Server 2012 R2-: Die WSADuplicateSocketW--Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anmerkung

Der winsock2.h-Header definiert WSADuplicateSocket als Alias, der die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante automatisch auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit Code, der nicht codierungsneutral ist, kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header- winsock2.h
Library Ws2_32.lib
DLL- Ws2_32.dll

Siehe auch

WSASocket-

Winsock-Funktionen

Winsock Reference