WSADuplicateSocketW-Funktion (winsock2.h)
Die WSADuplicateSocket-Funktion gibt eine WSAPROTOCOL_INFO-Struktur zurück, mit der ein neuer Socketdeskriptor für einen freigegebenen Socket erstellt 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 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 |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Beim Netzwerksubsystem ist ein Fehler aufgetreten. | |
Gibt an, dass einer der angegebenen Parameter ungültig war. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Es sind keine weiteren Socketbeschreibungen verfügbar. | |
Es ist kein Pufferplatz verfügbar. Der Socket kann nicht erstellt werden. | |
Der Deskriptor ist kein Socket. | |
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) Empfangen der Prozessbezeichneranforderung und -antwort | ||
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 einem Socket zugeordneten Zustandsinformationen werden in allen Deskriptoren gemeinsam gespeichert, da die Socketdeskriptoren dupliziert und nicht der tatsächliche Socket sind. Beispielsweise ist ein setockopt-Vorgang , der mit einem Deskriptor ausgeführt wird, anschließend mithilfe eines getsockopt von einem oder allen Deskriptoren sichtbar. Sowohl der Quellprozess als auch der Zielprozess sollten dieselben Flags an ihre jeweiligen WSASocket-Funktionsaufrufe übergeben. Wenn der Quellprozess die Socketfunktion zum Erstellen des Sockets verwendet, muss der Zielprozess das WSA_FLAG_OVERLAPPED Flag an seinen WSASocket-Funktionsaufruf übergeben. Ein Prozess kann closesocket für einen duplizierten Socket aufrufen, und der Deskriptor wird zugeordnet. Der zugrunde liegende Socket bleibt jedoch geöffnet, bis das Closesocket vom letzten verbleibenden Deskriptor aufgerufen wird.
Benachrichtigungen für freigegebene Sockets unterliegen den üblichen Einschränkungen von WSAAsyncSelect und WSAEventSelect. Wenn Sie einen dieser Aufrufe mit einem der freigegebenen Deskriptoren ausgeben, 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 den Prozess A und FD_WRITE Ereignisse an den Prozess B übermitteln. In Situationen, in der eine solche enge Koordinierung erforderlich ist, sollten Entwickler Threads anstelle separater Prozesse verwenden.
Windows 8.1 und Windows Server 2012 R2: Die WSADuplicateSocketW-Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Hinweis
Der winsock2.h-Header definiert WSADuplicateSocket als Alias, der automatisch die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit nicht codierungsneutralem Code 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 |
---|---|
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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für