Freigeben über


Deskriptorzuordnung

Windows Sockets-Dienstanbieter werden zwar empfohlen, Sockets als IFS-Objekte (Installable File System) zu implementieren, aber die Winsock-Architektur unterstützt auch Dienstanbieter, deren Sockethandles keine IFS-Objekte sind. Anbieter mit IFS-Handles geben dies über das XP1_IFS_HANDLES-Attributbit in der WSAPROTOCOL_INFO-Struktur an. (Hinweis: Das XP1_IFS_HANDLES Attributbits wurde nicht in Release 2.0.8 der API-Spezifikation enthalten, wurde aber seitdem über den Errata-Mechanismus hinzugefügt.) Winsock SPI-Clients können Anbieter nutzen, deren Socketdeskriptoren IFS-Handles sind, indem sie diese Deskriptoren mit standardmäßigen Windows-E/A-Funktionen wie ReadFile und WriteFile verwenden.

Wenn ein IFS-Anbieter einen neuen Socketdeskriptor erstellt, ist es zwingend erforderlich, dass der Anbieter WPUModifyIFSHandle aufruft , bevor das neue Handle für einen Windows Sockets SPI-Client bereitgestellt wird. Diese Funktion akzeptiert einen Anbieterbezeichner und ein vorgeschlagenes IFS-Handle vom Anbieter als Eingabe und gibt ein (möglicherweise) geändertes Handle zurück. Der IFS-Anbieter muss nur das geänderte Handle für seinen Client bereitstellen, und alle Anforderungen vom Client verweisen nur auf dieses geänderte Handle. Das geänderte Handle ist vom vorgeschlagenen Handle in Bezug auf das Betriebssystem garantiert nicht zu unterscheiden. Daher wählt der Dienstanbieter in den meisten Fällen einfach aus, nur das geänderte Handle in seiner gesamten internen Verarbeitung zu verwenden. Der Zweck dieser Änderungsfunktion besteht darin, dem Ws2_32.dll zu ermöglichen, den Prozess der Identifizierung des Dienstanbieters, der einem bestimmten Socket zugeordnet ist, erheblich zu optimieren.

Anbieter, die keine IFS-Handles zurückgeben, müssen über den WPUCreateSocketHandle-Aufruf ein gültiges Handle vom Ws2_32.dll abrufen. Der NonIFS-Anbieter darf nur ein Windows Sockets-2.DLL-Handle für seinen Client anbieten, und alle Anforderungen vom Client verweisen nur auf diese Handles. Als Vereinfachung für Dienstanbieterimplementierer ist einer der Eingabeparameter, die von einem Anbieter in WPUCreateSocketHandle bereitgestellt werden, ein DWORD-Kontextwert. Die Ws2_32.dll diesen Kontextwert dem zugeordneten Sockethandle zu und ermöglicht es einem Dienstanbieter, den Kontextwert jederzeit über den WPUQuerySocketHandleContext-Aufruf abzurufen. Eine typische Verwendung für diesen Kontextwert wäre das Speichern eines Zeigers auf eine vom Dienstanbieter verwaltete Datenstruktur, die zum Speichern von Socketstatusinformationen verwendet wird.