在最初为 NsdServiceInfo 设置属性并调用 registerService 之后,如何更新属性?
对于 iOS,您只需调用 [service setTXTRecordData...]。到目前为止,我还没有看到任何使用 Android 的方法。
在最初为 NsdServiceInfo 设置属性并调用 registerService 之后,如何更新属性?
对于 iOS,您只需调用 [service setTXTRecordData...]。到目前为止,我还没有看到任何使用 Android 的方法。
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()
我知道每个人都讨厌这种类型的答案...
但考虑尝试使用 3rd 方库来做到这一点。例如 JmDNS:https ://github.com/jmdns/jmdns
优点:
缺点:
我不熟悉 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()
。