Namensauflösungsdatenstrukturen
Es gibt mehrere wichtige Datenstrukturen, die in den Namensauflösungsfunktionen umfassend verwendet werden.
Query-Related Datenstrukturen
Die WSAQUERYSET-Struktur wird zum Erstellen von Abfragen für WSALookupServiceBegin und zum Bereitstellen von Abfrageergebnissen für WSALookupServiceNext verwendet. Es handelt sich um eine komplexe Struktur, da sie Zeiger auf mehrere andere Strukturen enthält, von denen einige noch auf andere Strukturen verweisen. Die Beziehung zwischen der WSAQUERYSET-Struktur und den Strukturen, auf die verwiesen wird, wird wie folgt veranschaulicht.
Innerhalb der WSAQUERYSET-Struktur sind die meisten Member selbsterklärend, aber einige verdienen eine zusätzliche Erklärung. Das dwSize-Element muss immer mit sizeof(WSAQUERYSET) ausgefüllt werden, da dies von Namespaceanbietern verwendet wird, um verschiedene Versionen der WSAQUERYSET-Struktur zu erkennen und anzupassen, die im Laufe der Zeit auftreten können.
Der dwOutputFlags-Member wird von einem Namespaceanbieter verwendet, um zusätzliche Informationen zu Abfrageergebnissen bereitzustellen. Ausführliche 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-Element die gewünschte Version des Diensts an. Das ecHow-Element ist ein aufgezählter Typ, der angibt, wie der Vergleich durchgeführt werden kann. Die Auswahl erfolgt 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-Members ist.
Die Interpretation von dwNameSpace und lpNSProviderId hängt von der Verwendung der Struktur ab 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 in 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 oben im Namespace.
- Jeder andere Wert startet die Suche am angegebenen Punkt.
Anbieter, die keine Eindämmung unterstützen, geben möglicherweise einen Fehler zurück, wenn etwas anderes als "" oder "\" angegeben ist. Anbieter, die eingeschränktes Containment unterstützen, z. B. Gruppen, sollten "", "\" oder einen festgelegten Punkt akzeptieren. Kontexte sind namespacespezifisch. Wenn das dwNameSpace-Element 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" zur Verfügung zu stellen.
Die AFPROTOCOLS-Struktur , auf die vom lpafpProtocols-Member verwiesen wird, wird nur für Abfragezwecke verwendet und stellt eine Liste von Protokollen bereit, um die Abfrage einzuschränken. Diese Protokolle werden als Paare (Adressfamilie, Protokoll) dargestellt, da Protokollwerte nur im Kontext einer Adressfamilie Bedeutung haben.
Das Array der CSADDR_INFO Struktur, auf die vom lpcsaBuffer-Member verwiesen wird, enthält alle Informationen, die entweder für einen Dienst zum Einrichten einer Lauschung oder für einen Client zum Herstellen einer Verbindung mit dem Dienst benötigt werden. 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 Bindfunktion mit LocalAddr.lpSockaddr und LocalAddr.lpSockaddrLength als Parameter aufruft .
Ein Client erstellt seinen Socket, indem er die Socket- oder WSASocket-Funktion mit dem Tupel LocalAddr.lpSockdr-sa_family>, iSocketType und iProtocol als Parameter aufruft. Ein Client verwendet die Kombination von RemoteAddr.lpSockaddr und RemoteAddr.lpSockaddrLength als Parameter, wenn eine Remoteverbindung mithilfe der Connect-, ConnectEx- oder WSAConnect-Funktion hergestellt wird.
Dienstklassendatenstrukturen
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 sieht wie folgt aus:
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.
Das lpClassInfos-Element in der WSASERVICECLASSINFO-Struktur verweist auf ein Array von WSANSCLASSINFO-Strukturen , die jeweils einen benannten und typisierten Member bereitstellt, der für einen angegebenen Namespace gilt. Beispiele für Werte für das lpszName-Element 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-Element können REG_DWORD, REG_SZ usw. sein. Das dwValueSize-Element gibt die Länge des Datenelements an, auf das von lpValue verwiesen wird.
Die gesamte Sammlung von Daten, die in einer WSASERVICECLASSINFO-Struktur dargestellt werden, wird jedem Namespaceanbieter bereitgestellt, wenn die WSAInstallServiceClass-Funktion aufgerufen wird. Jeder einzelne Namespaceanbieter durchsiebt dann die Liste der WSANSCLASSINFO-Strukturen und behält die für ihn relevanten Informationen bei.
Zugehörige Themen