LPNSPSETSERVICE 回调函数 (ws2spi.h)

NSPSetService 函数在命名空间中注册或取消注册服务实例。

语法

LPNSPSETSERVICE Lpnspsetservice;

INT Lpnspsetservice(
  [in] LPGUID lpProviderId,
  [in] LPWSASERVICECLASSINFOW lpServiceClassInfo,
  [in] LPWSAQUERYSETW lpqsRegInfo,
  [in] WSAESETSERVICEOP essOperation,
  [in] DWORD dwControlFlags
)
{...}

参数

[in] lpProviderId

指向在其中注册服务的特定命名空间提供程序的 GUID 的指针。

[in] lpServiceClassInfo

服务类架构信息。

[in] lpqsRegInfo

注册时要更新的属性信息。

[in] essOperation

请求的操作类型。

此参数可以是 Winsock2.h 头文件中定义的 WSAESETSERVICEOP 枚举类型的值之一。

含义
RNRSERVICE_REGISTER
0
注册服务。 对于 NetWare 环境中使用的服务广告协议 (SAP) 命名空间,这意味着发送定期广播。 这是域名系统 (DNS) 命名空间的 NOP。 对于永久性数据存储,这意味着要更新地址信息。
RNRSERVICE_DEREGISTER
1
取消注册服务。 对于 SAP 命名空间,这意味着停止发送定期广播。 这是 DNS 命名空间的 NOP。 对于永久性数据存储,这意味着要删除地址信息。
RNRSERVICE_DELETE
2
从动态名称和永久性空格中删除服务。 对于使用 SERVICE_MULTIPLE 标志) (多个CSADDR_INFO结构表示的服务,将仅删除提供的地址,这必须与注册服务时提供的相应 “CSADDR_INFO” 结构完全匹配。

[in] dwControlFlags

控制所请求的服务操作的一组标志。

此参数的可能值在 Winsock2.h 头文件中定义。

含义
SERVICE_MULTIPLE
0x00000001
控制操作的范围。

设置此值时,仅对给定地址集执行操作。 注册操作不会使现有地址失效,而取消注册操作只会使给定的地址集失效。

如果此值不存在,服务地址将作为一个组进行管理。 在添加给定地址集之前,注册或取消注册会使所有现有地址失效。

返回值

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

错误代码 含义
WSAEACCES
调用例程没有足够的权限来安装服务。
WSA_NOT_ENOUGH_MEMORY
没有足够的内存可用于执行此操作。
WSAEINVAL
此提供程序的一个或多个参数无效或缺失。
WSAEOPNOTSUPP
此操作不受支持。 如果命名空间提供程序未实现此函数,则返回此错误。
WSASERVICE_NOT_FOUND
服务未知。 在指定的命名空间中找不到该服务。

注解

下表列出了 essOperationdwControlFlags 的可用值。

操作 Flags 服务已存在 服务不存在
**RNRSERVICE_REGISTER** 覆盖 对象。 仅使用指定的地址。 对象为 REGISTERED。 创建新对象。 仅使用指定的地址。 对象为 REGISTERED。
**RNRSERVICE_REGISTER** **SERVICE_MULTIPLE** 汇报 对象。 将新地址添加到现有集。 对象为 REGISTERED。 创建新对象。 使用指定的所有地址。 对象为 REGISTERED。
**RNRSERVICE_DEREGISTER** 删除所有地址,但不从命名空间中删除对象。 对象为 DEREGISTERED。 WSASERVICE_NOT_FOUND
**RNRSERVICE_DEREGISTER** **SERVICE_MULTIPLE** 汇报 对象。 仅删除指定的地址。 仅当不存在地址时,将对象标记为 DEREGISTERED。 不从命名空间中删除。 WSASERVICE_NOT_FOUND
**RNRSERVICE_DELETE** 从命名空间中删除 对象。 WSASERVICE_NOT_FOUND
**RNRSERVICE_DELETE** **SERVICE_MULTIPLE** 仅删除指定的地址。 仅当未保留任何地址时,才会从命名空间中删除 对象。 WSASERVICE_NOT_FOUND
 

dwControlFlags 参数设置为 SERVICE_MULTIPLE 时,这使应用程序能够独立管理其地址。 当应用程序必须单独管理其协议或服务驻留在多台计算机上时,这非常有用。 例如,当一个服务使用多个协议时,一个侦听套接字可能会中止,但其他套接字仍可正常运行。 在此示例中,服务可以取消注册中止的地址,而不会影响其他地址。

使用 SERVICE_MULTIPLE 时,应用程序不得让旧地址保留在 对象中。 如果应用程序在未发出 RNRSERVICE_DEREGISTER 请求的情况下中止,则可能会发生这种情况。 注册服务时,它应存储其地址。 下一次调用时,服务应在注册新地址之前显式取消注册这些旧地址。

服务属性

下表列出了 WSAQUERYSET 成员名称,并介绍了如何表示服务属性数据。 可以为标记为 (可选) 的成员提供 null 指针。
WSAQUERYSET 成员名称 服务属性说明
**dwSize** 将 设置为 (WSAQUERYSET) 的大小。 这是一种版本控制机制。
**lpszServiceInstanceName** 引用的字符串包含服务实例名称。
**lpServiceClassId** 与此服务类对应的 GUID。
**lpVersion** 可选。 提供服务实例版本号。
**lpszComment** 可选。 可选的注释字符串。
**dwNameSpace** 此操作忽略。
**lpNSProviderId** 此操作忽略。 提供程序标识符包含在 lpProviderId 参数中。
**lpszContext** 可选。 分层命名空间中查询的起点。
**dwNumberOfProtocols** 此操作忽略。
**lpafpProtocols** 此操作忽略。
**pszQueryString** 此操作忽略。
**dwNumberOfCsAddrs** lpcsaBuffer 引用的CSADDR_INFO结构数组中的元素数。
**lpcsaBuffer** 指向包含服务正在侦听的地址 的CSADDR_INFO 结构的数组的指针。
**dwOutputFlags** 此操作忽略。
**lpBlob** 可选。 指向特定于提供程序的实体的指针。
 
**注意** CSADDR_INFO 结构的 “iProtocol” 成员可以包含清单常量 “IPROTOCOL_ANY” ,指示通配符值。 命名空间提供程序应将可接受的值替换为给定地址系列和套接字类型。
 

要求

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

另请参阅

CSADDR_INFO

WSAQUERYSET

WSASetLastError