在 SPI 中Query-Related数据结构

WSAQUERYSET 结构用于形成 NSPLookupServiceBegin 的查询,并用于传递 NSPLookupServiceNext 的查询结果。 它是一个复杂的结构,因为它包含指向其他几个结构的指针,其中一些结构仍然引用其他结构。 WSAQUERYSET 及其引用的结构之间的关系如下所示:

wsaqueryset 结构

WSAQUERYSET 结构中,大多数成员都是自我解释的,但有些成员值得进一步解释。 dwSize 将填充大小为 ( WSAQUERYSET) ,命名空间提供程序可以使用它来检测和适应可能出现的不同版本的 WSAQUERYSET 结构。

命名空间提供程序使用 dwOutputFlags 成员来提供有关查询结果的其他数据。 有关详细信息,请参阅 NSPLookupServiceNext

lpversion 引用的 WSAECOMPARATOR 结构用于查询约束和结果。 对于查询, dwVersion 成员指示服务的所需版本。 ecHow 成员是一个枚举类型,用于指定如何进行比较。 这些选项COMP_EQUALS这要求在版本中出现完全匹配,或者COMP_NOTLESS指定服务的版本号不小于 dwVersion 的值。

dwNameSpacelpNSProviderId 的解释取决于结构的使用方式,并在利用此结构的单个函数说明中进一步介绍。

lpszContext 成员适用于分层命名空间,并指定查询的起点或服务所在的层次结构中的位置。 一般规则是:

  • 值为 NULL、空白 (“”) 将在默认上下文中开始搜索。
  • 值为“\”将启动命名空间顶部的搜索。
  • 任何其他值在指定点开始搜索。

如果指定了除“”或“\”以外的任何内容,则不支持包含的提供程序可能会返回错误。 支持有限包含的提供程序(如组)应接受“”、“\”或指定点。 上下文特定于命名空间。 如果 dwNameSpace NS_ALL,则只应将“”或“\”作为上下文传递,因为它们会被所有命名空间识别。

lpszQueryString 成员用于提供其他特定于命名空间的查询信息,例如描述已知服务和传输协议名称的字符串,如“ftp/tcp”。

lpafpProtocols 引用的 AFPROTOCOLS 结构仅用于查询目的,并提供用于约束查询的协议列表。 这些协议表示为 (地址系列、协议) 对,因为协议值仅在地址系列上下文中有意义。

lpcsaBuffer 引用的 CSADDR_INFO 结构数组包含服务在建立侦听时使用或客户端建立服务连接所需的所有信息。 LocalAddrRemoteAddr 成员都直接包含 SOCKET_ADDRESS 结构。 服务将使用 localAddr.lpSockaddr-sa_family>、iSocketType、iProtocol) 元组 (创建套接字。 它将使用 LocalAddr.lpSockaddr 和 LocalAddr.lpSockaddrLength 将套接字绑定到本地地址。 客户端使用元组 (RemoteAddr.lpSockaddr-sa_family>、iSocketType、iProtocol) 创建套接字,并在建立远程连接时使用 RemoteAddr.lpSockaddr 和 RemoteAddr.lpSockaddrLength 的组合。