0

在最初为 NsdServiceInfo 设置属性并调用 registerService 之后,如何更新属性?

对于 iOS,您只需调用 [service setTXTRecordData...]。到目前为止,我还没有看到任何使用 Android 的方法。

4

3 回答 3

0

FWIW 原生 bonjour API 支持在不取消注册服务的情况下更新 txt 记录。

来自 dns_sd.h

DNSServiceUpdateRecord
 *
 * Update a registered resource record. The record must either be:
 *   - The primary txt record of a service registered via DNSServiceRegister()
 *   - A record added to a registered service via DNSServiceAddRecord()
 *   - An individual record registered by DNSServiceRegisterRecord()
于 2019-10-05T18:48:22.120 回答
0

我知道每个人都讨厌这种类型的答案...

但考虑尝试使用 3rd 方库来做到这一点。例如 JmDNS:https ://github.com/jmdns/jmdns

优点:

  • 它在 pre-Marshmallow 上没有问题(内置的 Android NSD 在 pre-M 上非常有问题,例如你无法读取发现的服务的属性);
  • 您可以使用 ServiceInfo 对象的 setText() 方法更新注册的服务属性。

缺点:

  • 如果将 Android 设备用作热点(没有 Internet 访问权限并提供自己的 WiFi 访问点而没有 Internet 访问权限),则它不起作用。
于 2017-05-16T19:53:37.400 回答
0

我不熟悉 iOS API,但根据rfc 6762 第 8.4 节,我认为没有直接的方法可以使用 NSD API 做到这一点:

在任何时候,如果任何主机的多播 DNS 记录的 rdata 发生变化,主机必须重复上述的通告步骤来更新相邻缓存。例如,如果任何主机的 IP 地址发生变化,它必须重新公布这些地址记录。主机不需要重复探测步骤,因为它已经建立了该名称的唯一所有权。

在共享记录的情况下,主机必须为旧的 rdata 发送一个 RR TTL 为零的“再见”通知(参见第 10.1 节,“再见数据包”),以便在通知新的 rdata 之前将其从对等缓存中删除. 在唯一记录的情况下,主机应该省略“再见”声明,因为新发布的记录上的缓存刷新位无论如何都会导致旧的 rdata 从对等缓存中刷新。

属性通常是在TXT记录中公布的,所以我认为iOS更新TXT记录没有什么魔力,它必须重新公告或发送“再见”公告。由于 Android NSD 不提供 API 来发送单个 TXT 记录,AFAIK,唯一的方法是调用NsdManager.unregisterService()then NsdManager.registerService()

于 2017-05-14T15:18:51.730 回答