我已经使用 Bonjour API 注册了一条记录。现在我想知道我刚刚发布的记录的内容。我通过指定一个 NULL 主机名来创建它,意思是“使用守护程序的默认值”,但我找不到一个简单的方法来查询它是什么!
使用 avahi,这很容易:我调用avahi_client_get_host_name()
以获取机器主机名的起始值。
对于 avahi 和 Bonjour,SRV 记录的值可以在注册的生命周期内更改 - 如果注册是使用 NULL 主机名完成的,则记录的主机名会在必要时自动更新。我在这里想要的只是一种在我执行注册时获取主机名初始值的方法。
请注意,在我的 Snow Leopard 测试机器上,默认的多播主机名与来自gethostname(2)
.
我能想到的四个解决方案:
- 在我的过程中获取主机名。它可能在某个地方。我
strings(3)
对我的进程的内存转储进行了搜索,并在我的地址空间中找到了四个多播主机名实例,但这可能是巧合,因为该名称用于其他用途。即使我所追求的字符串在我的进程中的某个地方,我也找不到一个 API 来理智地检索它。 - 从守护进程查询主机名。可能有一些查询我可以通过 mach 端口发送到获取它的守护进程?我再也找不到 API 了。相关的代码块在 mDNSResponder 的 uDNS.c 文件中,并且似乎没有通过 RPC 接口公开。
- 我可以查找我注册的服务。不过,这可能会涉及一些网络流量,所以除非有一些保证不会发生,否则我不愿意这样做。
重新实现 uDNS.c 中的逻辑。它从以下组合中获取机器的主机名:
- 动态 DNS 配置
- 静态配置的多播主机名
- 反向查找主接口的 IPv4 地址
- 它特别不使用
gethostname(2)
或等效
重新实现该逻辑似乎是不可行的。
目前,我倾向于进行查找以获取初始 SRV 注册的值,但这似乎并不理想。什么是正确的解决方案?