LPNSPLOOKUPSERVICENEXT 回调函数 (ws2spi.h)

NSPLookupServiceNext 函数是在从上一次调用 NSPLookupServiceBegin 获取句柄以检索请求的服务信息后调用的。

提供程序将在 lpqsResults 缓冲区中传递 WSAQUERYSET 结构。 客户端应调用此函数,直到返回 WSA_E_NOMORE,指示已返回所有 WSAQUERYSET

语法

LPNSPLOOKUPSERVICENEXT Lpnsplookupservicenext;

INT Lpnsplookupservicenext(
  [in]      HANDLE hLookup,
  [in]      DWORD dwControlFlags,
  [in, out] LPDWORD lpdwBufferLength,
  [out]     LPWSAQUERYSETW lpqsResults
)
{...}

参数

[in] hLookup

从上一次调用 WSALookupServiceBegin 返回的句柄

[in] dwControlFlags

用于控制下一操作的标志。 目前,只有 LUP_FLUSHPREVIOUS 定义为处理过大的结果集的方法。 如果应用程序无法提供足够大的缓冲区,则设置 LUP_FLUSHPREVIOUS 指示提供程序放弃最后一个结果集(太大),并转到下一个集进行此调用。

[in, out] lpdwBufferLength

lpqsResults指向的缓冲区中包含的大小(以字节为单位)。 在输出中,如果函数失败,并且错误为 WSAEFAULT,则它包含最小大小(以字节为单位)来传递 lpqsResults 以检索记录。

[out] lpqsResults

指向内存块的指针,该块将在返回时包含 WSAQUERYSET 结构中的一个结果集。

返回值

如果例程成功,该函数应返回 NO_ERROR(零)。 如果例程失败,并且必须使用 WSASetLastError设置相应的错误代码,则它应返回 SOCKET_ERROR (–1)。

错误代码 意义
WSA_E_CANCELLED
调用 NSPLookupServiceEnd 时,此调用仍在处理。 呼叫已取消。 未定义 lpqsResults 缓冲区中的数据。

在 Windows 套接字 2 中,WSAECANCELLED(10103)和 WSA_E_CANCELLED(10111)定义了冲突错误代码。WSAECANCELLED 的错误代码将在将来的版本中删除,并且只会保留WSA_E_CANCELLED。 Namespace提供程序应使用 WSA_E_CANCELLED 错误代码来保持与尽可能广泛的应用程序的兼容性。

WSA_E_NO_MORE
没有更多可用数据。

在 Windows 套接字 2 中,为 WSAENOMORE (10102) 和 WSA_E_NO_MORE (10110) 定义冲突错误代码。WSAENOMORE 的错误代码将在将来的版本中删除,并且仅保留WSA_E_NO_MORE。 Namespace提供程序应使用 WSA_E_NO_MORE 错误代码来保持与尽可能广泛的应用程序的兼容性。

WSA_INVALID_HANDLE
指定的查找句柄无效。
WSA_NOT_ENOUGH_MEMORY
没有足够的内存可用于执行此操作。
WSAEFAULT
lpqsResults 缓冲区太小,无法包含 WSAQUERYSET 集。
WSAEINVAL
此提供程序的一个或多个参数无效或缺失。
WSAEOPNOTSUPP
不支持该操作。 如果命名空间提供程序未实现此函数,则返回此错误。
WSANO_DATA
该名称在数据库中找到,但没有与给定限制匹配的数据。
WSASERVICE_NOT_FOUND
服务未知。 无法在指定的命名空间中找到该服务。

言论

此函数中指定的 dwControlFlagsNSPLookupServiceBegin 中指定的 将作为“限制”进行处理,以便进行组合。 限制在 NSPLookupServiceBegin 时间与 NSPLookupServiceNext 时间的限制组合在一起。 因此,NSPLookupServiceNext 上的标志永远无法增加 NSPLookupServiceBegin所请求的数据量,尽管指定或多或少标志不是错误。 在给定 NSPLookupServiceNext 中指定的标志 仅适用于该调用。

dwControlFlagsLUP_FLUSHPREVIOUSLUP_RES_SERVICE 是组合限制规则的例外(因为它们是行为标志而不是“限制”标志)。 如果在 NSPLookupServiceNext中使用任一标志,则无论在 NSPLookupServiceBegin设置相同的标志,它们都具有定义的效果。

例如,如果在 NSPLookupServiceBegin指定了 LUP_RETURN_VERSION,则服务提供商将检索包括版本在内的记录。 如果未在 NSPLookupServiceNext指定 LUP_RETURN_VERSION,则返回的信息不包括版本,即使它可用。 不会生成任何错误。

例如,如果未在 NSPLookupServiceBegin指定 LUP_RETURN_BLOB,但在 NSPLookupServiceNext指定,则返回的信息不包括专用数据。 不会生成任何错误。

查询结果

下表列出了 WSAQUERYSET,并介绍了如何在 WSAQUERYSET 结构中表示查询结果。 有关详细信息,请参阅 Query-Related 数据结构
WSAQUERYSET 成员名称 结果解释
**dwSize** 将设置为 sizeof(WSAQUERYSET)。 这用作版本控制机制。
**dwOutputFlags** **RESULT_IS_ALIAS** 标志指示这是别名结果。
**lpszServiceInstanceName** 引用包含服务名称的字符串。
**lpServiceClassId** 对应于服务类的 GUID。
**lpVersion** 引用特定服务实例的版本号。
**lpszComment** 自选。 服务实例提供的注释字符串。
**dwNameSpace** 在其中找到服务实例的Namespace。
**lpNSProviderId** 标识提供此查询结果的特定命名空间提供程序。
**lpszContext** 指定服务所在的分层命名空间中的上下文点。
**dwNumberOfProtocols** 未为结果定义。
**lpafpProtocols** 未为结果定义,所有所需的协议信息都在 CSADDR_INFO 结构中。
**lpszQueryString** dwControlFlags 包含 **LUP_RETURN_QUERY_STRING**时,此成员返回原始查询中指定的 lpszServiceInstanceName 的未分析剩余部分。 例如,在一个命名空间中,通过指定主机名和该主机中的文件路径的分层名称标识服务的命名空间中,返回的地址可能是主机地址,未分析的余数可能是文件路径。 如果完全分析了 **lpszServiceInstanceName**,并且使用了 **LUP_RETURN_QUERY_STRING**,则此成员为 null 或指向零长度字符串。
**dwNumberOfCsAddrs** 指示 CSADDR_INFO 结构数组中的元素数。
**lpcsaBuffer** 指向 CSADDR_INFO 结构的数组的指针,其中包含每个元素中包含的一个完整的传输地址。
**lpBlob** 自选。 指向特定于提供程序的实体的指针。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 ws2spi.h

另请参阅

CSADDR_INFO

NSPLookupServiceBegin

NSPLookupServiceEnd

NSP_ROUTINE

WSAQUERYSET

WSASetLastError