首先,Bonjour 到底是做什么的(请阅读下面我所写的猜测)?
这里我发现 Bonjour 可以自动发现 IP 网络上的计算机、设备和服务。但我认为它不仅能“发现 IP 网络上的设备”,还能通过为运行 Bonjour 的设备分配 IP 地址来创建 IP 网络。我对吗?我仍然没有领会到其中的精髓。它是否按以下方式工作?首先,我将设备(例如笔记本电脑)物理连接起来,以便它们可以相互通信。然后,假设我在某些笔记本电脑上运行 Bonjour,结果,这些笔记本电脑会自动为它们分配 IP 地址。因此,笔记本电脑(运行 Bonjour 的地方)会构建一个 IP 网络。是这么运作的吗?
或者运行 Bonjour 的计算机不被视为服务,它不会仅仅因为 Bonjour 在这台计算机上运行而广播自己。我的意思是,计算机上运行的应用程序需要使用 Bonjour 来广播自己。因此,广播自己的是应用程序(而不是计算机),并且广播不是自动完成的(应用程序需要明确广播自己)。这样对吗?
我的应用程序究竟如何进行自我广播?我可以使用命令行来注册服务吗?(以便所有使用 Bonjour 的应用程序都知道出现了新服务)?
此外,我希望有一个使用 Bonjour 创建的 IP 网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地说,我的应用程序需要有一个服务列表。列表中的每个服务都应该有一个名称、运行的 IP 地址以及应用程序使用的端口。Bonjour 能以某种方式提供这些信息吗?如果是的话,它究竟是如何工作的?我的程序如何从 Bonjour 获取这些信息?我的程序可以读取 Bonjour 创建的一些包含上述信息的文件吗?我可以在命令行中使用一些命令来检索这些信息吗?
我特别感兴趣的是从文件、环境变量或命令行中的命令访问有关服务的信息。在我看来,这些选项是最简单的!因为在这些情况下,我不需要使用任何额外的库来通过特定的编程语言与 Bonjour 进行通信。
PS 如果我的问题中有什么不清楚的地方,请提问。我会尝试以更清晰的方式阐述我的问题。
聚苯硫醚我使用 Windows 7。
补充:我计划用 PHP 编写应用程序。每台计算机都应运行 Apache Web 服务器。我想使用 Bonjour 帮助计算机相互发现(计算机在本地网络中工作)。
答案1
是的。Stuart Cheshire 是 Apple 公司 Rendezvous/Bonjour 的创建者和主要维护者,他还是 IETF ZeroConf 工作组的联合主席,并撰写了 O'Reilly 出版的《零配置网络》一书。他将 Bonjour 描述为“三条腿的凳子”,其中的三条腿分别是:
- IPv4(和 IPv6)链路本地寻址
- 多播名称解析 (mDNS)
- DNS 服务发现 (DNS-SD)
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 地址,并 ping 它返回的(其中一个)地址。但请注意,Bonjour 区分主机名和服务名。例如,如果您有两台独立的 USB 打印机(假设为“HP”和“Canon”)连接到 Alice,并且 Alice 充当这
lpr
两台打印机的打印服务器,则它们可以各自显示为自己的服务器,并映射回Alice.local
主机。他们的服务名称将向用户显示为“HP”和“Canon”,而不会提及 Alice。在幕后,它们将被称为和
HP._printer._tcp.local
,Canon._printer._tcp.local
并且对这些服务名称的 DNS-SD 查找将显示这些服务在两个不同的 TCP 端口上可用Alice.local
。因此,是的,应用程序必须通知 Bonjour 守护程序(
mDNSResponder
在 Apple 的实现中称为)它们有想要宣传的服务。macOS 具有自动处理不支持 Bonjour 的传统服务的服务宣传的机制。例如,macOS 的sshd
OpenSSH 不直接支持 Bonjour,但 macOS 负责ssh
通过 Bonjour 宣传服务,以便您可以从 LAN 上的其他机器上进行宣传。ssh [email protected]
在 macOS 上,有一个“dns-sd”命令行工具,可以使用以下语法注册服务:
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...] # (Register a service)
例如:
dns-sd -R MyWebsite _http._tcp local 80
如果它包含在 Windows 版 Bonjour 中,或包含在 Windows 版 Bonjour SDK 中,或者您可以从 Apple 的移动DNS响应器开源项目。在谷歌上搜索
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
查找我想要的“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
使用以下命令查询 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
请注意,在这些示例中,您必须
Ctrl-C
退出该dns-sd
工具。否则,它将永远保持打开状态,持续监视网络并报告您发出的查询结果的任何变化(例如,当您打开浏览查询时,网络上的 Web 服务器来来去去-B
)。我发现,由于这个和其他原因,该dns-sd
工具不太适合从脚本调用。毕竟,您可能想看看您的首选语言的 ZeroConf 库是什么。
回答您的另一个问题,我不知道有任何 ZeroConf 实现允许您仅通过读取/写入文件来执行查询并获得结果。大多数使用 Bonjour 的应用程序都是通过调用 API 来实现的,要么直接调用(C/C++/Obj-C/Swift 应用程序),要么通过特定于该语言的库(解释/脚本语言)。
答案2
首先,Bonjour 到底是做什么的(请阅读下面我的猜测)?在这里我发现 Bonjour 可以自动发现 IP 网络上的计算机、设备和服务。但我认为它不仅“发现 IP 网络上的设备”,还通过为运行 Bonjour 的设备分配 IP 地址来创建 IP 网络。我说得对吗?
不完全是;正如 Jon 指出的那样,DHCP(通常)用于分配 IP 地址。与普通 DNS 将域名转换为 IP 地址的方式非常相似,Bonjour 用于将临时域名(在本地网络内)转换为提供这些域名的 IP 地址。
我仍然没有领会到其中的精髓。它是否按以下方式工作?首先,我将设备(例如笔记本电脑)物理连接起来,以便它们可以相互通信。然后,假设我在某些笔记本电脑上运行 Bonjour,结果这些笔记本电脑会自动为自己分配 IP 地址。因此,笔记本电脑(运行 Bonjour 的地方)会构建一个 IP 网络。它是否按这种方式工作?
不,笔记本电脑很可能从本地 DHCP 服务器获取 IP 地址。Bonjour 只是帮助它们确定各自可以为其他设备提供哪些服务。
或者运行 Bonjour 的计算机不被视为服务,并且它不会仅仅因为 Bonjour 在这台计算机上运行而广播自己。我的意思是,计算机上运行的应用程序需要使用 Bonjour 来广播自己。因此,广播自己的是应用程序(而不是计算机),并且不是自动完成的(应用程序需要明确广播自己)。对吗?
是的 - 通常,您的应用程序需要明确宣传其存在。这通常可以使用系统提供的库(在 OS X 上很常见)或自定义库(例如 perl 的 Net::Bonjour)来完成。
我的应用程序究竟如何广播自己?我可以使用命令行来注册服务吗(这样所有使用 Bonjour 的应用程序都知道出现了新服务)
我不知道有哪个命令行工具可以做到这一点,但许多主流编程语言都有可用于做到这一点的库。
此外,我希望有一个使用 Bonjour 创建的 IP 网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地说,我的应用程序需要有一个服务列表。列表中的每个服务都应该有一个名称、运行的 IP 地址以及应用程序使用的端口。Bonjour 能以某种方式提供这些信息吗?
大多数 Bonjour 库应该能够为您做到这一点;请参阅第一个例子http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm
如果是的话,它究竟是如何工作的?我的程序如何从 Bonjour 获取此信息?我的程序可以读取由 Bonjour 创建的包含上述信息的一些文件吗?我可以使用命令行中的一些命令来检索此信息吗?
通过使用适当的库,该程序使用 Bonjour 协议来请求本地网络中的所有其他计算机告知它它们有哪些可用服务。然后,该库将解析响应并以更有用的格式呈现给您。
我对从文件、环境变量或命令行中的命令访问有关服务的信息特别感兴趣。这些选项在我看来是最简单的!因为在这些情况下,我不需要使用任何额外的库来通过特定的编程语言与 Bonjour 进行通信。
我不知道有哪个工具可以做到这一点,但它可能存在。
PS 如果我的问题中有什么不清楚的地方,请提出问题。我会尝试以更清晰的方式阐述我的问题。
有关您正在编写的程序将做什么以及使用哪种语言编写该程序的更多信息,将更容易提供帮助。
要了解更多介绍信息,请尝试以下两种方法: