首先,Bonjour究竟做了什么(请认真阅读我的猜测)?
在这里,我发现Bonjour能够自动发现IPnetworking上的计算机,设备和服务。 但是我认为,它不仅“发现IPnetworking上的设备”,还通过为运行Bonjour的设备分配IP地址来创buildIPnetworking。 我对吗?
我仍然错过了本质。 它以下列方式工作吗? 首先,我需要物理连接设备(例如笔记本电脑),以便它们可以相互通信。 然后,让我们说,在一些笔记本电脑上,我正在运行Bonjour,因此这些笔记本电脑会自动分配IP地址给自己。 因此,笔记本电脑(Bonjour正在运行)build立一个IPnetworking。 它以这种方式工作吗?
或者可能是运行Bonjour的计算机不被视为服务,并且仅仅因为Bonjour正在这台计算机上运行而不会自行播放。 我的意思是在电脑上运行的应用程序需要使用Bonjour来自己播放。 所以,它是应用程序自己播放(不是电脑),而不是自动完成(应用程序需要明确地自己播放)。 这样对吗?
我的应用程序可以如何播放? 我可以使用命令行注册一个服务 (这样所有使用Bonjour的应用程序都知道一个新的服务出现了)?
此外,我想有一个应用程序使用Bonjour创build的IPnetworking。 为此,我的应用程序需要知道networking中存在哪些设备/服务。 更详细的说,我的应用程序需要有一个服务列表。 列表中的每个服务都应该有一个名称,运行的IP地址和应用程序使用的端口。 Bonjour能以某种方式提供这些信息吗? 如果是这样,它究竟是如何工作的。 我的程序如何从Bonjour获得这些信息? 我的程序是否可以读取由Bonjour创build的文件,并包含上述信息? 我可以在命令行中使用一些命令来检索这些信息吗?
我特别感兴趣的是通过命令行访问文件,环境variables或命令中的服务信息。 这些选项在我看来是最简单的! 因为在这种情况下,我不需要使用任何额外的库来从特定的编程语言与Bonjour进行通信。
PS请问如果我的问题中有些问题不清楚,请提问。 我会试图以更清晰的方式来提出我的问题。
PPS 我使用Windows 7 。
ADDED:我打算用PHP写我的应用程序。 每台电脑都应该运行一个Apache Web服务器。 我想用Bonjour来帮助电脑发现对方(电脑在本地networking中工作)。
是。 Stuart Cheshire是苹果公司Rendezvous / Bonjour的创始人和主要维护者,同时担任IETF ZeroConf工作组的主持人,并撰写了O'Reilly关于零configurationnetworking的书籍,将Bonjour描述为“有腿的凳子“,腿是:
IETF ZeroConf工作组和Apple都认为链路本地寻址,特别是IPv4链路本地寻址(169.254.0.0/16地址)是ZeroConf / Bonjour的一部分,尽pipe在其他两个“腿”的凳子“。
请注意,由于即使没有安装Apple的Bonjour for Windows软件,Windows也已经支持自动链接本地寻址,但许多Windows用户并不认为IPv4链接本地寻址是Bonjour / ZeroConf的一部分。
是。 默认情况下,Mac和Windows计算机将执行IPv4链接本地寻址(如果它们configuration为DHCP,但没有可用的DHCP服务器)。 安装了Avahi(或其他可能的ZeroConf实现)的Linux和BSD机器也会这样做。
如果计算机正在运行Bonjour,则其主机名将通过mDNS在LAN上发布。 如果您的机器名称是“Alice”,则它将通过mDNS成为Alice.local
。 从另一台计算机(我们称之为“Bob”)在同一个局域网上(具体地说,在同一个本地链路组播域上),你应该能够简单地键入ping Alice.local
,Bob应该对Alice进行mDNS查找。本地发现爱丽丝的IP地址,并ping(返回)其地址(之一)。
请注意,Bonjour区分主机名和服务名称。 例如,如果您有两台独立的USB打印机,比如说连接到Alice的“HP”和“Canon”,Alice就是两台打印服务器,可以分别显示为自己的打印服务器服务,作为主机映射回Alice.local。
他们的服务名称将显示给用户“惠普”和“佳能”没有提到爱丽丝。 在幕后,他们将被称为HP._printer._tcp.local
和Canon._printer._tcp.local
,并且在这些服务名称上的DNS-SD查找将显示这些服务在Alice.local
上在两个不同的TCP端口上可用。
所以,是的,应用程序必须通知Bonjour守护进程(在苹果的实现中称为mDNSResponder)他们有他们想要做广告的服务。 Mac OS X具有自动处理原生Bonjour感知的旧服务的服务广告的机制。 例如,Mac OS X的sshd是OpenSSH,它不直接支持Bonjour,但是Mac OS X负责通过Bonjour广告ssh服务,这样你就可以从LAN上的其他机器上ssh [email protected]
。
在Mac OS X上,有一个“dns-sd”命令行工具,可以使用以下语法注册服务:
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...] # (Register a service)
举个例子:
dns-sd -R MyWebsite _http._tcp local 80
如果它包含在Bonjour for Windows或Bonjour SDK for Windows中,或者如果您可以从Apple的mDNSResponder开放源代码项目为Windows编译它,我不会感到惊讶。 谷歌search“dns-sd.exe”,我看到这样的事情存在,我不知道我只是下载一个二进制文件,我会尝试从上面提到的包之一,或自己编译它mDNSResponder项目的来源。
您也可以使用dns-sd命令行工具浏览服务并查找它们。 以下是查找本地Web服务的示例:
使用-B
:浏览本地Web服务
$ 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
看看我想要的一个,“我的酷Web应用程序”,与-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 TC Rdata 16:32:40.786 Add 2 6 MyWebServer.local. 1 1 169.254.45.209 ^C
注意在这些例子中,你必须Ctrl-C离开dns-sd工具,否则它将永远保持打开状态,不断观察networking并报告你发出的查询结果中的任何变化(例如Web服务器进出在networking上,而你坐在一个-B
浏览查询打开)。 我发现由于这个和其他原因,dns-sd工具不适合从脚本中调用。 毕竟,你可能想看看你的首选语言的ZeroConf库。
要回答你的其他问题之一,我不知道有任何ZeroConf实现,它允许你通过读/写文件来执行查询和获得结果。 大多数使用Bonjour的应用程序都是通过直接调用API(C / C ++ / Obj-C应用程序)或通过特定于该语言的库(解释/脚本语言)来调用API。
首先,Bonjour究竟做了什么(请认真阅读我的猜测)? 在这里,我发现Bonjour能够自动发现IPnetworking上的计算机,设备和服务。 但是我认为,它不仅“发现IPnetworking上的设备”,还通过为运行Bonjour的设备分配IP地址来创buildIPnetworking。 我对吗?
不完全的; 正如Jon所指出的那样,DHCP(通常)用于分配IP地址。 与普通DNS将域名转换为IP地址的方式大致相同,Bonjour用于将临时域名(在本地networking内)转换为提供IP地址的IP地址。
我仍然错过了本质。 它以下列方式工作吗? 首先,我需要物理连接设备(例如笔记本电脑),以便它们可以相互通信。 然后,让我们说,在一些笔记本电脑上,我正在运行Bonjour,然后这些笔记本电脑自动分配IP地址给自己。 因此,笔记本电脑(Bonjour正在运行)build立一个IPnetworking。 它以这种方式工作吗?
不; 笔记本电脑很可能从本地DHCP服务器获取其IP地址。 Bonjour只是帮助他们确定每个人可以提供给他人的服务。
或者可能是运行Bonjour的计算机不被视为服务,并且仅仅因为Bonjour正在这台计算机上运行而不会自行播放。 我的意思是在电脑上运行的应用程序需要使用Bonjour来自己播放。 所以,它是应用程序自己播放(不是电脑),而不是自动完成(应用程序需要明确地自己播放)。 这样对吗?
是的 – 通常,您的应用程序需要明确地宣传其存在。 这通常可以使用系统提供的库(在OS X上通用)或自定义库(例如perl的Net :: Bonjour)来完成。
我的应用程序可以如何播放? 我可以使用命令行来注册一个服务(这样所有使用Bonjour的应用程序都知道一个新服务出现了)
我不知道这样做的命令行工具,但许多主要的编程语言有库可用来做到这一点。
此外,我想有一个应用程序使用Bonjour创build的IPnetworking。 为此,我的应用程序需要知道networking中存在哪些设备/服务。 更详细的说,我的应用程序需要有一个服务列表。 列表中的每个服务都应该有一个名称,运行的IP地址和应用程序使用的端口。 Bonjour能以某种方式提供这些信息吗?
Bonjour图书馆的大部分应该可以为你做这个; 见http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm上的第一个例子
如果是这样,它究竟是如何工作的。 我的程序如何从Bonjour获得这些信息? 我的程序是否可以读取由Bonjour创build的文件,并包含上述信息? 我可以在命令行中使用一些命令来检索这些信息吗?
使用适当的库,该程序使用Bonjour协议来请求本地networking中的所有其他计算机告诉它有哪些可用的服务。 那么这个图书馆会parsing这些回复,并以更有用的格式呈现给你。
我特别感兴趣的是通过命令行访问文件,环境variables或命令中的服务信息。 这些选项在我看来是最简单的! 因为在这种情况下,我不需要使用任何额外的库来从特定的编程语言与Bonjour进行通信。
我不知道这样做的工具,但它可能存在。
PS请问如果我的问题中有些问题不清楚,请提出问题。 我会试图以更清晰的方式来提出我的问题。
有关您正在编写的程序的更多信息,以及您正在使用什么语言编写,将使其更容易帮助。
有关更多介绍性信息,请尝试两种方法:
Bonjour不分配IP地址 – 这是一个发现协议 – 你仍然需要DHCP /静态/链接本地(APIPA)IP地址才能正常工作。
它使用多播DNS(mDNS)来发现与同一个广播域上的主机是什么,它本身就是它自己的DNS服务器。
见下面的Bonjour & Zeroconf 。
除非你的应用程序是一个家庭/不可pipe理的networking,也就是说,缺less一个本地的DNS服务器,你不需要它。