Query-Related Datenstrukturen in der SPI

Die WSAQUERYSET-Struktur wird zum Erstellen von Abfragen für NSPLookupServiceBeginverwendet und zum Liefern von Abfrageergebnissen für NSPLookupServiceNext verwendet. 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 WSAQUERYSET und den Strukturen, auf die verwiesen wird, wird wie folgt veranschaulicht:

wsaqueryset-Strukturen

Innerhalb der WSAQUERYSET-Struktur sind die meisten Member selbsterklärend, aber einige sind eine zusätzliche Erklärung. DwSize wird mit sizeof( WSAQUERYSET) gefüllt und kann von Namespaceanbietern verwendet werden, um verschiedene Versionen der WSAQUERYSET-Struktur zu erkennen und sich an diese anzupassen, die möglicherweise angezeigt werden.

Das dwOutputFlags-Member wird von einem Namespaceanbieter verwendet, um zusätzliche Daten zu Abfrageergebnissen zur Verfügung zu stellen. Weitere Informationen finden Sie unter NSPLookupServiceNext.

Die WSAECOMPARATOR-Struktur, auf die lpversion verweist, 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 erfolgt. 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 von _ _ dwVersion 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 dwNameSpace 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 lpafpProtocols 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 von lpcsaBuffer verwiesen wird, enthält alle Informationen, die für einen Dienst zum Einrichten eines Lauschens oder 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 erstellt einen Socket mithilfe des Tupels (LocalAddr.lpSockaddr->sa _ family, iSocketType, iProtocol). Er würde den Socket mit localAddr.lpSockaddr und LocalAddr.lpSockaddrLength an eine lokale Adresse binden. Der Client erstellt seinen Socket mit dem Tupel (RemoteAddr.lpSockaddr->sa family, iSocketType, iProtocol) und verwendet beim Herstellen einer Remoteverbindung die Kombination aus _ RemoteAddr.lpSockaddr und RemoteAddr.lpSockaddrLength.