我希望实现的目标是拥有一个提供特定服务的服务器列表。
E.g。让我们说我server01
发布了一个名为ControlSystem
的服务。现在我添加了server02
,它还发布了一个名为ControlSystem
的服务。
我想要的是能够发现发布ControlSystem
服务的服务器列表。
我认为这应该是可能的(例如,您可能有多个打印机发布打印服务),但是当我使用dsn-sd -R
在两个不同的服务器上注册服务时,{{{ 1}}简单地说:
dns-sd -L
这不是很有用,因为我想至少拥有两台服务器的IP地址。
答案 0 :(得分:1)
正如您所说的,is it possible to publish the same service name
在不同的服务器上,答案是肯定的。
但不是您已经实现的。
service
名称只是服务的名称,而不是instance
的名称。例如,对于Web服务器服务,service
名称为_http._tcp
。
该名称在服务器之间可以相同。
服务器之间的不同之处在于每个服务的instance
。通常将设备名称与服务名称与域名(在Bonjour / Zeroconf中为.local
)连接在一起。
继续使用Web服务器示例,将得到server1._http._tcp.local
和server2._http._tcp.local
。
该实例名称在服务器之间(甚至在同一服务器内)也必须是唯一的,以防您将拥有多个服务(例如使用不同的端口)。
设备名称也应该是唯一的。例如,对于ZeroConf,它是在多播DNS RFC(8. Probing and Announcing on Startup)中指定的。
关于您的特定情况,您正在两个服务器中注册相同的实例名称,如上所述,这是不允许的。
您应在每个服务器中注册不同的实例,即:
dns-sd -R server01 _http._tcp local 8088
dns-sd -R server02 _http._tcp local 8088
在每个服务器中。
执行完此操作后,您应该能够浏览HTTP服务:
dns-sd -B _http._tcp local.
应该找到两个实例。
最后,由于您尝试注册新的非标准服务(ControlService
),因此应仅将_http
替换为服务名称,并将_tcp
替换为实际协议(_tcp
或_udp
):
dns-sd -R server01 ControlService._tcp local 8088
dns-sd -R server02 ControlService._tcp local 8088
查询:
dns-sd -B ControlService._tcp local.