Share via


LPWSPDUPLICATESOCKET-Rückruffunktion (ws2spi.h)

Die LPWSPDuplicateSocket-Funktion gibt eine WSAPROTOCOL_INFO-Struktur zurück, mit der ein neuer Socketdeskriptor für einen freigegebenen Socket erstellt werden kann.

Syntax

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

Parameter

[in] s

Lokale Socketdeskriptor.

[in] dwProcessId

Bezeichner des Zielprozesses, für den der freigegebene Socket verwendet wird.

[out] lpProtocolInfo

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

[out] lpErrno

Zeiger auf den Fehlercode.

Rückgabewert

Wenn kein Fehler auftritt, gibt LPWSPDuplicateSocket null zurück. Andernfalls wird der Wert von SOCKET_ERROR zurückgegeben, und eine bestimmte Fehlernummer ist in lpErrno verfügbar.

Fehlercode Bedeutung
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAEINVAL
Gibt an, dass einer der angegebenen Parameter ungültig war.
WSAEINPROGRESS
Das Blockieren des Windows Sockets-Aufrufs wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin 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.

Hinweise

Ein Quellprozess ruft LPWSPDuplicateSocket 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 LPWSPSocket verwendet, um einen Deskriptor für den duplizierten Socket abzurufen. Beachten Sie, dass die spezielle WSAPROTOCOL_INFO-Struktur nur einmal vom Zielprozess verwendet werden kann.

Es liegt in der Verantwortung des Dienstanbieters, alle vorgänge auszuführen, die im Quellprozesskontext erforderlich sind, und eine WSAPROTOCOL_INFO-Struktur zu erstellen, die erkannt wird, wenn sie anschließend als Parameter für LPWSPSocket im Kontext der Zielprozesse angezeigt wird. Der Anbieter muss dann einen Socketdeskriptor zurückgeben, der auf einen gemeinsamen zugrunde liegenden Socket verweist. Das dwProviderReserved-Element der WSAPROTOCOL_INFO-Struktur ist für die Verwendung durch den Dienstanbieter verfügbar und kann verwendet werden, um alle nützlichen Kontextinformationen zu speichern, einschließlich eines duplizierten Handles.

Wenn ein neuer Socketdeskriptor zugewiesen wird, muss ein installierbarer Dateisystemanbieter (IFS) WPUModifyIFSHandle aufrufen, und ein Nicht-IFS-Anbieter muss WPUCreateSocketHandle aufrufen. Ein IFS-Anbieter kann die DuplicateHandle-Funktion verwenden. Um eine ordnungsgemäße Ausführung der Socketduplizierung sicherzustellen, muss ein Nicht-IFS-Dienstanbieter die LPWSPDuplicateSocket-Funktion verwenden.

Ein mögliches Szenario zum Einrichten und Verwenden eines freigegebenen Sockets im Übergabemodus wird im Folgenden veranschaulicht.

Quellprozess IPC Bedeutung
1) LPWSPSocket, LPWSPConnect
2) Fordert den Zielprozessbezeichner an.
==>
3) Empfängt Die Anforderung des Prozessbezeichners und die Antwort.
4) Empfängt den Prozessbezeichner.
<==
5) Ruft **LPWSPDuplicateSocket** auf, um eine spezielle WSAPROTOCOL_INFO-Struktur zu erhalten.
6) Sendet WSAPROTOCOL_INFO Struktur an das Ziel.
==> 7) Empfängt WSAPROTOCOL_INFO Struktur.
8) Ruft LPWSPSocket auf, um freigegebene Socketdeskriptor zu erstellen.
9) Verwendet freigegebenen Socket für den Datenaustausch.
10) LPWSPCloseSocket
<==

Die Deskriptoren, die auf einen freigegebenen Socket verweisen, können unabhängig von 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. Eine typische Verwendung für freigegebene Sockets besteht darin, einen Prozess zu haben, der für das Erstellen von Sockets und das Herstellen von Verbindungen verantwortlich ist, die Sockets an andere Prozesse übergeben, die für den Informationsaustausch verantwortlich sind.

Da dupliziert die Socketdeskriptoren und nicht der zugrunde liegende Socket sind, werden alle einem Socket zugeordneten Zustände für alle Deskriptoren gemeinsam gehalten. Beispielsweise ist ein WSPSetSockOpt-Vorgang , der mit einem Deskriptor ausgeführt wird, anschließend mit einem LPWSPGetSockopt von einem oder allen Deskriptoren sichtbar. Ein Prozess kann LPWSPCloseSocket auf einem duplizierten Socket aufrufen, und der Deskriptor wird zugeordnet. Der zugrunde liegende Socket bleibt jedoch geöffnet, bis LPWSPClosesocket vom letzten verbleibenden Deskriptor aufgerufen wird.

Benachrichtigungen für freigegebene Sockets unterliegen den üblichen Einschränkungen von LPWSPAsyncSelect und LPWSPEventSelect. 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 z. B. keine FD_READ Ereignisse zum Verarbeiten von A und FD_WRITE Ereignisse für den Prozess B liefern. Für Situationen, in denen eine solche enge Koordinierung erforderlich ist, wird empfohlen, dass Entwickler Threads anstelle separater Prozesse verwenden.

Ein mehrschichtige Dienstanbieter stellt eine Implementierung dieser Funktion bereit, ist aber auch ein Client dieser Funktion, wenn er LPWSPDuplicateSocket der nächsten Schicht in der Protokollkette aufruft. Einige besondere Aspekte gelten für den lpProtocolInfo-Parameter dieser Funktion, da er über die Ebenen der Protokollkette nach unten weitergegeben wird.

Wenn die nächste Ebene in der Protokollkette eine andere Ebene ist, muss diese Ebene beim Aufruf des LPWSPDuplicateSocket der nächsten Ebene an die nächste Ebene übergeben , eine lpProtocolInfo , die auf dieselbe unveränderte WSAPROTOCOL_INFO Struktur mit den gleichen unveränderten Ketteninformationen verweist. Wenn die nächste Ebene jedoch das Basisprotokoll (d. h. das letzte Element in der Kette) ist, führt diese Ebene eine Ersetzung durch, wenn das LPWSPDuplicateSocket des Basisanbieters aufgerufen wird. In diesem Fall sollte der lpProtocolInfo-Parameter auf die WSAPROTOCOL_INFO Struktur des Basisanbieters verweisen.

Ein wesentlicher Vorteil dieser Richtlinie ist, dass die Basisdienstanbieter keine Protokollketten kennen müssen. Die gleiche Richtlinie gilt beim Verteilen einer WSAPROTOCOL_INFO-Struktur über eine mehrschichtige Sequenz anderer Funktionen wie LPWSPAddressToString, WSPStartup, LPWSPSocket oder LPWSPStringToAddress.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Kopfzeile ws2spi.h

Weitere Informationen

WPUCreateSocketHandle

WPUModifyIFSHandle