WSADuplicateSocketA-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 WSADuplicateSocketA(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOA 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 vom Client zugeordneten Puffer, 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 der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
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 noch eine Rückruffunktion.
WSAEMFILE
Es sind keine weiteren Socketbeschreibungen verfügbar.
WSAENOBUFS
Es ist kein Pufferplatz 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.

Hinweise

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 IPC-Mechanismus (Interprocess Communications), 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 zu erhalten. 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 zum Einrichten und Übergeben eines freigegebenen Sockets wird in der folgenden Tabelle veranschaulicht.

Quellprozess IPC Zielprozess
1) WSASocket, WSAConnect
2) Anforderung des Zielprozessbezeichners ==>
3) Anforderung des Prozessbezeichners empfangen und antworten
4) Empfangsprozessbezeichner <==
5) Rufen Sie WSADuplicateSocket auf, um eine spezielle WSAPROTOCOL_INFO-Struktur zu erhalten.
6) Senden WSAPROTOCOL_INFO Struktur an das Ziel
==> 7) Empfangen WSAPROTOCOL_INFO Struktur
8) Rufen Sie WSASocket auf, um einen freigegebenen Socketdeskriptor zu erstellen.
9) Verwenden eines freigegebenen Sockets für den Datenaustausch
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 keine Zugriffssteuerung, sodass es an den beteiligten Prozessen liegt, ihre Vorgänge auf einem freigegebenen Socket zu koordinieren. Freigegebene Sockets werden in der Regel für einen Prozess verwendet, der für das Erstellen von Sockets und das Herstellen von Verbindungen verantwortlich ist, sowie für 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 werden und nicht der tatsächliche Socket. Beispielsweise ist ein setockopt-Vorgang , der mit einem Deskriptor ausgeführt wird, anschließend mithilfe eines getsockopt-Vorgangs von einem oder allen Deskriptoren sichtbar. Sowohl der Quellprozess als auch der Zielprozess sollten die gleichen Flags an ihre jeweiligen WSASocket-Funktionsaufrufe übergeben. Wenn der Quellprozess die Socketfunktion zum Erstellen des Sockets verwendet, muss der Zielprozess das flag WSA_FLAG_OVERLAPPED an seinen WSASocket-Funktionsaufruf übergeben. 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 vom letzten verbleibenden Deskriptor aufgerufen wird.

Die Benachrichtigung für freigegebene Sockets unterliegt den üblichen Einschränkungen von 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. Daher kann ein freigegebener Socket keine FD_READ Ereignisse für die Verarbeitung von A und FD_WRITE Ereignisse zum Verarbeiten von B liefern. In Situationen, in der eine solche enge Koordination erforderlich ist, wird Entwicklern 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.

Hinweis

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

   
Unterstützte Mindestversion (Client) Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile winsock2.h
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

WSASocket

Winsock-Funktionen

Winsock-Referenz