首先,Bonjour 到底做了什么(请阅读我下面写的猜测)?
在这里,我发现 Bonjour 可以自动发现 IP 网络上的计算机、设备和服务。但我认为它不仅“发现 IP 网络上的设备”,它还通过将 IP 地址分配给运行 Bonjour 的设备来创建 IP 网络。我对吗?我仍然怀念本质。它是否以下列方式工作?首先,我以物理方式连接设备(例如笔记本电脑),以便它们可以相互通信。然后,假设在一些笔记本电脑上我运行 Bonjour,然后,这些笔记本电脑会自动为它们分配 IP 地址。因此,笔记本电脑(运行 Bonjour 的地方)构建了一个 IP 网络。它以这种方式工作吗?
或者可能是运行 Bonjour 的计算机不被视为一项服务,并且它不会仅仅因为 Bonjour 在这台计算机上运行而广播自己。我的意思是计算机上运行的应用程序需要使用 Bonjour 进行广播。因此,是应用程序自己广播(而不是计算机)并且它不是自动完成的(应用程序需要明确地广播自己)。这样对吗?
我的应用程序究竟如何广播自己?我可以使用命令行注册服务(以便所有使用 Bonjour 的应用程序都知道出现了新服务)吗?
此外,我想要一个使用 Bonjour 创建的 IP 网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地说,我的应用程序需要有一个服务列表。列表中的每个服务都应该有一个名称、运行它的 IP 地址和应用程序使用的端口。Bonjour 能否以某种方式提供此信息?如果是这样,它究竟是如何工作的。我的程序如何从 Bonjour 获取这些信息?我的程序可以读取一些由 Bonjour 创建并包含上述信息的文件吗?我可以在命令行中使用一些命令来检索这些信息吗?
我对从文件、环境变量或命令行中的命令访问有关服务的信息特别感兴趣。这些选项在我看来是最简单的!因为在这些情况下,我不需要使用任何其他库来通过特定编程语言与 Bonjour 进行通信。
PS如果我的问题不清楚,请提出问题。我将尝试以更清晰的方式提出我的问题。
PPS我使用的是 Windows 7。
补充:我打算用 PHP 编写我的应用程序。每台计算机都应该运行 Apache Web 服务器。我想使用 Bonjour 帮助计算机发现彼此(计算机在本地网络中工作)。
是的。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
andCanon._printer._tcp.local
,对这些服务名称的 DNS-SD 查找将显示这些服务Alice.local
在两个不同的 TCP 端口上可用。所以是的,应用程序必须通知 Bonjour 守护程序(
mDNSResponder
在 Apple 的实现中调用)他们有他们想要宣传的服务。macOS 具有自动处理原生服务不支持 Bonjour 的服务广告的机制。例如,macOSsshd
是 OpenSSH,它不直接支持 Bonjour,但 macOS 负责ssh
通过 Bonjour 宣传该服务,这样您就可以ssh [email protected]
从 LAN 上的其他机器上进行服务。在 macOS 上,有一个“dns-sd”命令行工具可以使用以下语法注册服务:
例如:
如果它包含在 Windows 的 Bonjour 或 Windows 的 Bonjour SDK 中,或者您可以从 Apple 的mDNSResponder开源项目为 Windows 编译它,我不会感到惊讶。谷歌搜索
dns-sd.exe
,我看到这样的事情存在。我不确定我是否会为它下载一个二进制文件。相反,我会尝试从上面提到的软件包之一中获取它,或者自己从 mDNSResponder 项目源中编译它。您还可以使用
dns-sd
命令行工具浏览和查找服务。以下是查找本地 Web 服务的示例:使用以下命令浏览本地 Web 服务
-B
:使用以下命令查找我想要的“My Cool Web App”
-L
:使用以下命令查询 MyWebServer.local 的 IP 地址
-Q
:请注意,在这些示例中,您必须
Ctrl-C
退出该dns-sd
工具。否则它将永远保持打开状态,持续观察网络并报告您发出的查询结果的任何变化(例如网络服务器在网络上来来往往,而您坐着-B
浏览查询打开)。我发现由于这个和其他原因,该dns-sd
工具不太适合从脚本调用。毕竟,您可能想看看您首选语言的 ZeroConf 库。要回答您的其他问题之一,我不知道有任何 ZeroConf 实现允许您仅通过读取/写入文件来执行查询并获得结果。大多数使用 Bonjour 的应用程序都是通过直接调用 API(C/C++/Obj-C/Swift 应用程序)或通过特定于语言的库(解释/脚本语言)来实现的。
不完全的; 正如 Jon 指出的那样,DHCP(通常)用于分配 IP 地址。与普通 DNS 将域名转换为 IP 地址的方式非常相似,Bonjour 用于将临时域名(在本地网络内)转换为提供它们的 IP 地址。
没有; 笔记本电脑很可能从本地 DHCP 服务器获取 IP 地址。Bonjour 只是帮助他们确定每个人可以为其他人提供哪些服务。
是的 - 通常,您的应用程序需要明确宣传其存在。这通常可以使用系统提供的库(在 OS X 上常见)或自定义库(例如 perl 的 Net::Bonjour)来完成。
我不知道执行此操作的命令行工具,但许多主要编程语言都有可用的库来执行此操作。
大多数 Bonjour 库应该能够为您执行此操作;请参阅http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm的第一个示例
使用适当的库,该程序使用 Bonjour 协议询问本地网络中的所有其他计算机,告诉它它们有哪些可用的服务。然后,该库将解析响应并以更有用的格式呈现给您。
我不知道有什么工具可以做到这一点,但它可能存在。
有关您正在编写的程序将做什么以及您正在使用什么语言编写的更多信息将使帮助变得更容易。
有关更多介绍性信息,请同时尝试:
Bonjour 不分配 IP 地址 - 它是一种发现协议 - 您仍然需要 DHCP/静态/链路本地 (APIPA) IP 地址才能使其工作。
它使用多播 DNS (mDNS) 来发现哪些主机与它自己在同一个广播域上,本质上它成为它自己的 DNS 服务器。
请参阅Bonjour和Zeroconf了解详情。
除非您的应用程序用于家庭/非托管网络,也就是说,缺少本地 DNS 服务器,否则您根本不需要它。