Rom*_*man 29 networking mdns bonjour
首先,卓悦究竟是做什么的(请阅读我在下面写的猜测)?
在这里,我发现 Bonjour 可以自动发现 IP 网络上的计算机、设备和服务。但我认为它不仅“发现 IP 网络上的设备”,还通过为运行 Bonjour 的设备分配 IP 地址来创建 IP 网络。我对吗?
我仍然想念本质。它以下列方式工作吗?首先,我以物理方式连接设备(例如笔记本电脑),以便它们可以相互通信。然后,比方说,在我运行 Bonjour 的某些笔记本电脑上,这些笔记本电脑以自动方式为它们自己分配 IP 地址。因此,笔记本电脑(运行 Bonjour 的地方)构建了一个 IP 网络。它以这种方式工作吗?
或者可能是一台运行 Bonjour 的计算机不被视为一项服务,它不会仅仅因为 Bonjour 在这台计算机上运行而广播自己。我的意思是在计算机上运行的应用程序需要使用 Bonjour 来广播自己。因此,是应用程序自己广播自己(而不是计算机)并且它不是自动完成的(应用程序需要明确地广播自己)。这样对吗?
我的应用程序究竟如何广播自己?我可以使用命令行注册服务吗(以便所有使用 Bonjour 的应用程序都知道出现了新服务)?
此外,我想要一个使用 Bonjour 创建的 IP 网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地说,我的应用程序需要有一个服务列表。列表中的每个服务都应该有一个名称、它运行的 IP 地址和应用程序使用的端口。Bonjour 能否以某种方式提供这些信息?如果是这种情况,它究竟是如何工作的。我的程序如何从 Bonjour 获取这些信息?我的程序可以读取 Bonjour 创建的包含上述信息的文件吗?我可以在命令行中使用一些命令来检索这些信息吗?
我对从文件、环境变量或命令行中的命令访问有关服务的信息特别感兴趣。这些选项在我看来是最简单的!因为在这些情况下,我不需要使用任何额外的库来通过特定的编程语言与 Bonjour 进行通信。
PS 如果我的问题中有不清楚的地方,请提出问题。我将尝试以更清晰的方式提出我的问题。
PPS我使用的是 Windows 7。
补充:我计划用 PHP 编写我的应用程序。每台计算机都应该运行一个 Apache Web 服务器。我想用 Bonjour 来帮助计算机发现彼此(计算机在本地网络中工作)。
Spi*_*iff 56
是的。Stuart Cheshire 是 Apple Rendezvous/Bonjour 的创建者和主要维护者,也是 IETF ZeroConf 工作组的联合主席,并撰写了关于零配置网络的 O'Reilly 一书,他将 Bonjour 描述为“三个-腿凳”,其中腿是:
IETF ZeroConf 工作组和 Apple 都认为链路本地寻址,尤其是 IPv4 链路本地寻址(169.254.0.0/16
地址)是 ZeroConf/Bonjour 的一部分,尽管链路本地寻址比其他两条“凳子”早了几年。
请注意,由于即使没有安装 Apple 的 Bonjour for Windows 软件,Windows 也已经支持自动链接本地寻址,因此许多 Windows 用户并不认为 IPv4 链接本地寻址是 Bonjour/ZeroConf 的一部分。
是的。如果 Mac 和 Windows 机器配置为 DHCP 但没有可用的 DHCP 服务器,则默认情况下它们会执行 IPv4 链路本地寻址。安装了 Avahi(或可能的其他 ZeroConf 实现)的 Linux 和 BSD 机器也将执行此操作。
如果一台计算机运行 Bonjour,它的主机名通过 mDNS 发布在 LAN 上。如果您的机器名称是“Alice”,它将Alice.local
通过 mDNS。在同一 LAN(特别是在同一链路本地多播域)上的另一台计算机(我们称其为“Bob”),您应该能够简单地键入ping Alice.local
,并且 Bob 应该进行 mDNS 查找Alice.local
以发现 Alice 的 IP 地址( es),并ping(其中一个)它返回的地址。
但请注意,Bonjour 区分主机名和服务名。例如,如果您有两台独立的 USB 打印机,假设“HP”和“Canon”连接到 Alice,并且 Alice 充当lpr
它们的打印服务器,那么它们都可以显示为自己的服务,映射回Alice.local
主机。
他们的服务名称将向用户显示为“HP”和“Canon”,而不会提及 Alice。在幕后,它们被称为HP._printer._tcp.local
and Canon._printer._tcp.local
,并且对这些服务名称的 DNS-SD 查找将显示这些服务Alice.local
在两个不同的 TCP 端口上可用。
所以是的,应用程序必须通知 Bonjour 守护进程(mDNSResponder
在 Apple 的实现中调用)他们有要宣传的服务。macOS 具有自动处理原生服务不支持 Bonjour 的服务广告的机制。例如,macOSsshd
是 OpenSSH,它不直接支持 Bonjour,但 macOS 负责ssh
通过 Bonjour来宣传该服务,以便您可以ssh username@Alice.local
从局域网上的其他机器上访问。
在 macOS 上,有一个“dns-sd”命令行工具可以使用以下语法注册服务:
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]
# (Register a service)
Run Code Online (Sandbox Code Playgroud)
例如:
dns-sd -R MyWebsite _http._tcp local 80
Run Code Online (Sandbox Code Playgroud)
如果它包含在适用于 Windows 的 Bonjour 或适用于 Windows 的 Bonjour SDK 中,或者您可以从 Apple 的mDNSResponder开源项目为 Windows 编译它,我不会感到惊讶。谷歌搜索dns-sd.exe
,我看到存在这样的事情。我不确定我是否会为它下载一个二进制文件。相反,我会尝试从上面提到的包之一中获取它,或者从 mDNSResponder 项目源中自己编译它。
您还可以使用dns-sd
命令行工具浏览服务并查找它们。以下是查找本地 Web 服务的示例:
使用以下命令浏览本地 Web 服务-B
:
$ dns-sd -B _http._tcp local
Browsing for _http._tcp.local
Timestamp A/R Flags if Domain Service Type Instance Name
16:30:59.870 Add 3 6 local. _http._tcp. My Cool Web App
16:30:59.871 Add 3 6 local. _http._tcp. Someone Else's Web Service
16:30:59.871 Add 3 6 local. _http._tcp. A Third One
^C
Run Code Online (Sandbox Code Playgroud)
查找我想要的“My Cool Web App”,使用-L
:
$ dns-sd -L "My Cool Web App" _http._tcp local
Lookup My Cool Web App._http._tcp.local
16:31:52.678 My\032Cool\032Web\032App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)
^C
Run Code Online (Sandbox Code Playgroud)
使用以下命令查询 MyWebServer.local 的 IP 地址-Q
:
$ dns-sd -Q MyWebServer.local
Timestamp A/R Flags if Name T C Rdata
16:32:40.786 Add 2 6 MyWebServer.local. 1 1 169.254.45.209
^C
Run Code Online (Sandbox Code Playgroud)
请注意,在这些示例中,您必须Ctrl-C
退出该dns-sd
工具。否则它将永远保持打开状态,不断观察网络并报告您发出的查询结果的任何变化(例如,当您坐在-B
浏览查询打开时,网络服务器在网络上进进出出)。我发现由于这个原因和其他原因,该dns-sd
工具不太适合从脚本中调用。毕竟,您可能想查看您首选语言的 ZeroConf 库。
为了回答您的其他问题之一,我不知道有任何 ZeroConf 实现允许您仅通过读取/写入文件来执行查询并获得结果。大多数使用 Bonjour 的应用程序都是通过直接调用 API(C/C++/Obj-C/Swift 应用程序)或通过特定于语言的库(解释/脚本语言)来实现的。