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 |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Fehler beim Netzwerksubsystem. | |
Gibt an, dass einer der angegebenen Parameter ungültig war. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch 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) 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 |