情况如下。我想在服务器上运行一个应用程序。公司里的所有桌面都必须连接到它。但我不希望将服务器的 IP 地址硬编码到桌面应用程序中。相反,我希望服务器能够通过某种广播机制宣布自己。桌面应用程序将监听这样的消息,从而了解服务器的 IP 地址,然后可以连接到它
我该怎么做?我需要使用多播吗?多播消息可以传多远?桌面应用程序如何监听多播数据?
答案1
最常见的方法是使用普通DNS。您的公司可能有自己的域名;可能是内部域名;只需在其下添加一个子域名 –myapp.internal.example.com
或myapp.corp
类似的东西 – 并指向您的服务器地址。
myapp.<domain>. A 10.0.0.5
myapp.<domain>. AAAA 2001:db8::123:4
(毕竟,这是服务器,其 IP 地址不太可能每周更改。当它确实更改时,您只需更新 DNS 中的子域。)
您可以使其更加先进并使用SRV 记录而不是直接的 A/AAAA 地址记录。例如,XMPP 聊天协议使用 SRV 记录来定位域的服务器,这些服务器可以有多个,且具有不同的优先级:
chat1.<domain>. A 10.0.0.4
chat2.<domain>. A 10.0.0.7
; priority, weight, port, hostname
_xmpp._tcp.<domain>. SRV 0 0 5222 chat1.<domain>.
_xmpp._tcp.<domain>. SRV 10 0 5222 chat1.<domain>.
对于应用程序来说,这更加复杂,因为它们现在需要一些逻辑来按 SRV 优先级然后按权重对返回的记录进行排序,但它可能会带来一些优势,例如能够添加较慢的“备份”服务器。
如果出于某种原因无法接受,你可以尝试现有的基于多播的服务发现协议(其中一些将名称解析和服务发现合二为一;而另一些则将其分开。)
Apple 和各种 Linux 发行版使用 Bonjour/Avahi,又名移动DNS(“多播 DNS”)结合DNS-SD用于通用服务发现和本地名称解析;
(有些程序决定仅以自己自定义的格式广播 UDP 数据报说“我在这里!”。这种方法效果不佳。)
通常有操作系统提供的 API 和第三方库来使用相应的发现协议查找特定的服务。
如果你要自己实现某些功能,每个操作系统也提供以下功能:加入多播组并接收任何人发送至该组的消息。IP 多播应该默认在广播域内工作,但通常需要配置为通过路由器。