Namensauflösungsdatenstrukturen

Es gibt mehrere wichtige Datenstrukturen, die in den Namensauflösungsfunktionen umfassend verwendet werden.

Die WSAQUERYSET-Struktur wird verwendet, um Abfragen für WSALookupServiceBeginzu erstellen, und verwendet, um Abfrageergebnisse für WSALookupServiceNext zu liefern. Es handelt sich um eine komplexe Struktur, da sie Zeiger auf mehrere andere Strukturen enthält, von denen einige auf andere Strukturen verweisen. Die Beziehung zwischen der WSAQUERYSET-Struktur und den Strukturen, auf die verwiesen wird, wird wie folgt veranschaulicht.

Beziehung zwischen wsaqueryset und den zugehörigen Strukturen

Innerhalb der WSAQUERYSET-Struktur sind die meisten Member selbsterklärend, aber einige sind eine zusätzliche Erklärung. Der dwSize-Member muss immer mit sizeof(WSAQUERYSET) gefüllt werden, da dies von Namespaceanbietern verwendet wird, um verschiedene Versionen der WSAQUERYSET-Struktur zu erkennen und sich an diese anzupassen, die im Laufe der Zeit auftreten können.

Der dwOutputFlags-Member wird von einem Namespaceanbieter verwendet, um zusätzliche Informationen zu Abfrageergebnissen zur Verfügung zu stellen. Weitere Informationen finden Sie in der WSALookupServiceNext-Funktion.

Die WSAECOMPARATOR-Struktur, auf die vom lpversion-Member verwiesen wird, wird sowohl für Abfrageeinschränkungen als auch für Ergebnisse verwendet. Bei Abfragen gibt das dwVersion-Mitglied die gewünschte Version des Diensts an. Der ecHow-Member ist ein aufzählter Typ, der angibt, wie der Vergleich vorgenommen werden kann. Die Optionen sind COMP EQUALS, was erfordert, dass eine genaue Übereinstimmung in der Version auftritt, oder COMP NOTLESS, die angibt, dass die Versionsnummer des Diensts nicht kleiner als der Wert des _ _ dwVersion-Mitglieds ist.

Die Interpretation von dwNameSpace und lpNSProviderId hängt davon ab, wie die Struktur verwendet wird, und wird in den einzelnen Funktionsbeschreibungen, die diese Struktur verwenden, weiter beschrieben.

Das lpszContext-Element gilt für hierarchische Namespaces und gibt den Ausgangspunkt einer Abfrage oder den Speicherort innerhalb der Hierarchie an, in der sich der Dienst befindet. Allgemeine Regeln

  • Der Wert NULL, leer ("") startet die Suche im Standardkontext.
  • Der Wert " \ " startet die Suche am Anfang des Namespace.
  • Jeder andere Wert startet die Suche am angegebenen Punkt.

Anbieter, die keine Stützung unterstützen, geben möglicherweise einen Fehler zurück, wenn etwas anderes als "" oder " \ " " angegeben ist. Anbieter, die eine eingeschränkte Stützung unterstützen, z. B. Gruppen, sollten "", " " oder einen \ angegebenen Punkt akzeptieren. Kontexte sind namespacespezifisch. Wenn der dwNameSpace-Member NS ALL ist, sollte nur "" oder " " " als Kontext übergeben werden, da diese von allen _ \ Namespaces erkannt werden.

Der lpszQueryString-Member wird verwendet, um zusätzliche namespacespezifische Abfrageinformationen wie eine Zeichenfolge zur Beschreibung eines bekannten Dienst- und Transportprotokollnamens wie in "FTP/TCP" zu liefern.

Die AFPROTOCOLS-Struktur, auf die das lpafpProtocols-Member verweist, wird nur zu Abfragezwecken verwendet und stellt eine Liste von Protokollen zur Einschränkung der Abfrage zur Verfügung. Diese Protokolle werden als Paare (Adressfamilie, Protokoll) dargestellt, da Protokollwerte nur innerhalb des Kontexts einer Adressfamilie eine Bedeutung haben.

Das Array der CSADDR _ INFO-Struktur, auf die vom lpcsaBuffer-Member verwiesen wird, enthält alle Informationen, die für einen Dienst zum Einrichten eines Lauschens oder für einen Client zum Herstellen einer Verbindung mit dem Dienst erforderlich sind. Die Member LocalAddr und RemoteAddr enthalten beide direkt eine SOCKET _ ADDRESS-Struktur.

Ein Dienst würde einen Socket erstellen, indem er die Socket- oder WSASocket-Funktion mithilfe des Tupels von LocalAddr.lpSockaddr->sa _ family, iSocketType und iProtocol als Parameter aufruft. Ein Dienst würde den Socket an eine lokale Adresse binden, indem er die bind-Funktion mit localAddr.lpSockaddr und LocalAddr.lpSockaddrLength als Parameter aufruft.

Ein Client erstellt seinen Socket, indem er die Socket- oder WSASocket-Funktion mithilfe des Tupels von LocalAddr.lpSockaddr->sa _ family, iSocketType und iProtocol als Parameter aufruft. Ein Client verwendet die Kombination aus RemoteAddr.lpSockaddr und RemoteAddr.lpSockaddrLength als Parameter, wenn eine Remoteverbindung mithilfe der Connect-, ConnectEx-oder WSAConnect-Funktion hergestellt wird.

Datenstrukturen der Dienstklasse

Wenn eine neue Dienstklasse installiert wird, muss eine WSASERVICECLASSINFO-Struktur vorbereitet und bereitgestellt werden. Diese Struktur besteht auch aus Unterstrukturen, die eine Reihe von Membern enthalten, die für bestimmte Namespaces gelten. Eine Klasseninformationsdatenstruktur ist wie folgt:

Architektur von Dienstklassendatenstrukturen

Für jede Dienstklasse gibt es eine einzelne WSASERVICECLASSINFO-Struktur. Innerhalb der WSASERVICECLASSINFO-Struktur ist der eindeutige Bezeichner der Dienstklasse im lpServiceClassId-Member enthalten, und auf eine zugeordnete Anzeigezeichenfolge wird vom lpServiceClassName-Member verwiesen. Dies ist die Zeichenfolge, die von der WSAGetServiceClassNameByClassId-Funktion zurückgegeben wird.

Der lpClassInfos-Member in der WSASERVICECLASSINFO-Struktur verweist auf ein Array von WSANSCLASSINFO-Strukturen, von denen jedes einen benannten und typierten Member liefert, der für einen angegebenen Namespace gilt. Beispiele für Werte für den lpszName-Member sind: "SapId", "TcpPort", "UdpPort" usw. Diese Zeichenfolgen sind im Allgemeinen spezifisch für den Namespace, der im dwNameSpace-Member identifiziert wird. Typische Werte für das dwValueType-Member können REG _ DWORD, REG _ SZ usw. sein. Das dwValueSize-Element gibt die Länge des Datenelements an, auf das lpValue zeigt.

Die gesamte Auflistung von Daten, die in einer WSASERVICECLASSINFO-Struktur dargestellt werden, wird für jeden Namespaceanbieter bereitgestellt, wenn die WSAInstallServiceClass-Funktion aufgerufen wird. Jeder einzelne Namespaceanbieter durchsingt dann die Liste der WSANSCLASSINFO-Strukturen und behält die entsprechenden Informationen bei.

AFPROTOCOLS

_CSADDR-INFORMATIONEN

Namensauflösungsmodell

Protokollunabhängige Namensauflösung

Registrierung und Namensauflösung

_SOCKETADRESSE

Zusammenfassung der Namensauflösungsfunktionen

WSAECOMPARATOR

WSAGetServiceClassNameByClassId

WSAInstallServiceClass

WSALookupServiceBegin

WSAQUERYSET

WSASERVICECLASSINFO