Freigegebene Sockets im SPI
Die Socketfreigabe zwischen Prozessen in Windows Sockets wird wie folgt implementiert. Ein Quellprozess ruft WSPDuplicateSocket 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 Zielprozess verwendet dann die WSAPROTOCOL_INFO-Struktur in einem Aufruf von WSPSocket. Der von dieser Funktion zurückgegebene Socketdeskriptor ist ein zusätzlicher Socketdeskriptor für einen zugrunde liegenden Socket, der somit freigegeben wird.
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 WSPSocket im Kontext des Zielprozesses angezeigt wird. Der dwProviderReserved-Member der WSAPROTOCOL_INFO-Struktur steht für die Verwendung durch den Dienstanbieter zur Verfügung und kann zum Speichern aller nützlichen Kontextinformationen verwendet werden, einschließlich eines duplizierten Handles.
Dieser Mechanismus ist sowohl für Singlethread-Versionen als auch für präemptive Multithreadversionen von Windows geeignet. Beachten Sie jedoch, dass Sockets für Threads in einem bestimmten Prozess ohne Verwendung der WSPDuplicateSocket-Funktion freigegeben werden können, da ein Socketdeskriptor in allen Threads eines Prozesses gültig ist.
Wie im Abschnitt Deskriptorzuordnung beschrieben, müssen IFS-Anbieter WPUModifyIFSHandle und Nicht-IFS-Anbieter WPUCreateSocketHandle aufrufen, wenn neue Socketdeskriptoren zugeordnet werden.
Ein mögliches Szenario zum Einrichten und Verwenden eines freigegebenen Sockets in einem Übergabemodus wird in der folgenden Tabelle veranschaulicht.
Quellprozess | IPC | Zielprozess |
---|---|---|
1) WSPSocket, WSPConnect | ||
2) Anforderung des Zielprozessbezeichners. | ==> | |
3) Empfängt die Prozessbezeichneranforderung und antwortet. | ||
4) Empfängt den Prozessbezeichner. | <== | |
5) Ruft WSPDuplicateSocket 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 WSPSocket auf, um einen freigegebenen Socketdeskriptor zu erstellen. | ||
9) Verwendet freigegebenen Socket für den Datenaustausch. | ||
10) WSPClosesocket | <== |