【发布时间】:2013-08-16 10:43:26
【问题描述】:
我使用 Bonjour API 注册了一条记录。现在我想知道我刚刚发布的记录的内容。我通过指定一个 NULL 主机名来创建它,意思是“使用守护进程的默认值”,但我找不到一个简单的方法来查询它是什么!
使用 avahi,很容易:我调用 avahi_client_get_host_name() 来获取机器主机名的起始值。
对于 avahi 和 Bonjour,SRV 记录的值可以在注册的生命周期内更改 - 如果注册是使用 NULL 主机名完成的,则记录的主机名会在必要时自动更新。我想要的只是在我执行注册时获取主机名的 initial 值的方法。
请注意,在我的 Snow Leopard 测试机器上,默认的多播主机名不与来自 gethostname(2) 的机器名称相同。
我能想到的四个解决方案:
- 在我的进程中获取主机名。它可能在某个地方。我对我的进程的内存转储进行了
strings(3)搜索,并在我的地址空间中找到了多播主机名的四个实例,但考虑到该名称用于其他用途,这可能是巧合。即使我所追求的字符串在我的进程中的某个地方,我也无法找到一个 API 来合理地检索它。 - 从守护程序查询主机名。可能有一些查询我可以通过 mach 端口发送到获取它的守护进程?我再也找不到 API 了。相关代码块在 mDNSResponder 的 uDNS.c 文件中,似乎没有通过 RPC 接口暴露。
- 我可以查找我注册的服务。不过,这可能会涉及一些网络流量,因此除非有某种保证不会发生,否则我不愿意这样做。
-
重新实现 uDNS.c 中的逻辑。它从以下组合中获取机器的主机名:
- 动态 DNS 配置
- 静态配置的多播主机名
- 反向查找主接口的 IPv4 地址
- 它特别不使用
gethostname(2)或等效项
重新实现该逻辑似乎不可行。
目前,我倾向于进行查找以获取初始 SRV 注册的值,但这似乎并不理想。正确的解决方案是什么?
【问题讨论】:
-
不知道有没有更好的方法,但是我认为#3不涉及网络流量,因为本地的mDNSResponder知道答案。对我来说,这似乎是最可靠的方法。
-
竞争条件让我很恼火——如果守护进程检测到冲突,它将撤回记录,因此查找可能会产生流量(尽管几乎不可能)。不过还是可以忍受的。
标签: macos networking bonjour zeroconf mdns