是否可以让mDNS / Bonjour在不同的服务器上发布相同的服务名称

时间:2018-05-07 14:50:47

标签: bonjour mdns

我希望实现的目标是拥有一个提供特定服务的服务器列表。

E.g。让我们说我server01发布了一个名为ControlSystem的服务。现在我添加了server02,它还发布了一个名为ControlSystem的服务。

我想要的是能够发现发布ControlSystem服务的服务器列表。

我认为这应该是可能的(例如,您可能有多个打印机发布打印服务),但是当我使用dsn-sd -R在两个不同的服务器上注册服务时,{{{ 1}}简单地说:

dns-sd -L

这不是很有用,因为我想至少拥有两台服务器的IP地址。

1 个答案:

答案 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.localserver2._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.