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 枚举类型的值之一。
值 | 含义 |
---|---|
|
注册服务。 对于 NetWare 环境中使用的服务广告协议 (SAP) 命名空间,这意味着发送定期广播。 这是域名系统 (DNS) 命名空间的 NOP。 对于永久性数据存储,这意味着要更新地址信息。 |
|
取消注册服务。 对于 SAP 命名空间,这意味着停止发送定期广播。 这是 DNS 命名空间的 NOP。 对于永久性数据存储,这意味着要删除地址信息。 |
|
从动态名称和永久性空格中删除服务。 对于使用 SERVICE_MULTIPLE 标志) (多个CSADDR_INFO结构表示的服务,将仅删除提供的地址,这必须与注册服务时提供的相应 “CSADDR_INFO” 结构完全匹配。 |
[in] dwControlFlags
控制所请求的服务操作的一组标志。
此参数的可能值在 Winsock2.h 头文件中定义。
值 | 含义 |
---|---|
|
控制操作的范围。
设置此值时,仅对给定地址集执行操作。 注册操作不会使现有地址失效,而取消注册操作只会使给定的地址集失效。 如果此值不存在,服务地址将作为一个组进行管理。 在添加给定地址集之前,注册或取消注册会使所有现有地址失效。 |
返回值
如果例程成功 , 函数应返回NO_ERROR (零) 。 如果例程失败,它应返回 SOCKET_ERROR (–1) ,并且必须使用 WSASetLastError 设置相应的错误代码。
错误代码 | 含义 |
---|---|
调用例程没有足够的权限来安装服务。 | |
没有足够的内存可用于执行此操作。 | |
此提供程序的一个或多个参数无效或缺失。 | |
此操作不受支持。 如果命名空间提供程序未实现此函数,则返回此错误。 | |
服务未知。 在指定的命名空间中找不到该服务。 |
注解
下表列出了 essOperation 和 dwControlFlags 的可用值。
操作 | 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** | 可选。 指向特定于提供程序的实体的指针。 |
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | ws2spi.h |