名称解析数据结构

有几个重要的数据结构在名称解析函数中广泛使用。

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

wsaqueryset 与其关联结构之间的关系

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

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

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>iSocketTypeiProtocol 作为参数的元组调用套接字WSASocket 函数来创建套接字。 服务通过使用 LocalAddr.lpSockaddrLocalAddr.lpSockaddrLength 作为参数调用绑定函数,将套接字绑定到本地地址。

客户端通过使用 LocalAddr.lpSockaddr-sa_family>iSocketTypeiProtocol 作为参数的元组调用套接字WSASocket 函数来创建其套接字。 使用 connectConnectExWSAConnect 函数建立远程连接时,客户端使用 RemoteAddr.lpSockaddrRemoteAddr.lpSockaddrLength 的组合作为参数。

服务类数据结构

安装新的服务类时,必须准备并提供 WSASERVICECLASSINFO 结构。 此结构还包含子结构,这些子结构包含应用于特定命名空间的一系列成员。 类信息数据结构如下所示:

服务类数据结构体系结构

对于每个服务类,都有一个 WSASERVICECLASSINFO 结构。 在 WSASERVICECLASSINFO 结构中,服务类的唯一标识符包含在 lpServiceClassId 成员中,lpServiceClassName 成员引用关联的显示字符串。 这是 由 WSAGetServiceClassNameByClassId 函数返回的字符串。

WSASERVICECLASSINFO 结构中的 lpClassInfos 成员引用 WSANSCLASSINFO 结构的数组,其中每个结构都提供一个应用于指定命名空间的命名和类型化成员。 lpszName 成员的值示例包括:“SapId”、“TcpPort”、“UdpPort”等。这些字符串通常特定于 dwNameSpace 成员中标识的命名空间。 dwValueType 成员的典型值可能是REG_DWORD、REG_SZ等。dwValueSize 成员指示 lpValue 指向的数据项的长度。

调用 WSAInstallServiceClass 函数时,会将 WSASERVICECLASS 结构中表示的整个数据集合提供给每个命名空间提供程序。 然后,每个单独的命名空间提供程序筛选 WSANSCLASSINFO 结构的列表,并保留适用于它的信息。

AFPROTOCOLS

CSADDR_INFO

名称解析模型

与协议无关的名称解析

注册和名称解析

SOCKET_ADDRESS

名称解析函数摘要

WSAECOMPARATOR

WSAGetServiceClassNameByClassId

WSAInstallServiceClass

WSALookupServiceBegin

WSAQUERYSET

WSASERVICECLASSINFO