如何使用Bonjour?

  1. 首先,Bonjour究竟做了什么(请认真阅读我的猜测)?
    在这里,我发现Bonjour能够自动发现IPnetworking上的计算机,设备和服务。 但是我认为,它不仅“发现IPnetworking上的设备”,还通过为运行Bonjour的设备分配IP地址来创buildIPnetworking。 我对吗?

  2. 我仍然错过了本质。 它以下列方式工作吗? 首先,我需要物理连接设备(例如笔记本电脑),以便它们可以相互通信。 然后,让我们说,在一些笔记本电脑上,我正在运行Bonjour,因此这些笔记本电脑会自动分配IP地址给自己。 因此,笔记本电脑(Bonjour正在运行)build立一个IPnetworking。 它以这种方式工作吗?

  3. 或者可能是运行Bonjour的计算机不被视为服务,并且仅仅因为Bonjour正在这台计算机上运行而不会自行播放。 我的意思是在电脑上运行的应用程序需要使用Bonjour来自己播放。 所以,它是应用程序自己播放(不是电脑),而不是自动完成(应用程序需要明确地自己播放)。 这样对吗?

  4. 我的应用程序可以如何播放? 我可以使用命令行注册一个服务 (这样所有使用Bonjour的应用程序都知道一个新的服务出现了)?

  5. 此外,我想有一个应用程序使用Bonjour创build的IPnetworking。 为此,我的应用程序需要知道networking中存在哪些设备/服务。 更详细的说,我的应用程序需要有一个服务列表。 列表中的每个服务都应该有一个名称,运行的IP地址和应用程序使用的端口。 Bonjour能以某种方式提供这些信息吗? 如果是这样,它究竟是如何工作的。 我的程序如何从Bonjour获得这些信息? 我的程序是否可以读取由Bonjour创build的文件,并包含上述信息? 我可以在命令行中使用一些命令来检索这些信息吗?

  6. 我特别感兴趣的是通过命令行访问文件,环境variables或命令中的服务信息。 这些选项在我看来是最简单的! 因为在这种情况下,我不需要使用任何额外的库来从特定的编程语言与Bonjour进行通信。

PS请问如果我的问题中有些问题不清楚,请提问。 我会试图以更清晰的方式来提出我的问题。

PPS 我使用Windows 7

ADDED:我打算用PHP写我的应用程序。 每台电脑都应该运行一个Apache Web服务器。 我想用Bonjour来帮助电脑发现对方(电脑在本地networking中工作)。

  1. 是。 Stuart Cheshire是苹果公司Rendezvous / Bonjour的创始人和主要维护者,同时担任IETF ZeroConf工作组的主持人,并撰写了O'Reilly关于零configurationnetworking的书籍,将Bonjour描述为“有腿的凳子“,腿是:

    1. IPv4(和IPv6)链路本地寻址
    2. 多播名称parsing(mDNS)
    3. DNS服务发现(DNS-SD)

    IETF ZeroConf工作组和Apple都认为链路本地寻址,特别是IPv4链路本地寻址(169.254.0.0/16地址)是ZeroConf / Bonjour的一部分,尽pipe在其他两个“腿”的凳子“。

    请注意,由于即使没有安装Apple的Bonjour for Windows软件,Windows也已经支持自动链接本地寻址,但许多Windows用户并不认为IPv4链接本地寻址是Bonjour / ZeroConf的一部分。

  2. 是。 默认情况下,Mac和Windows计算机将执行IPv4链接本地寻址(如果它们configuration为DHCP,但没有可用的DHCP服务器)。 安装了Avahi(或其他可能的ZeroConf实现)的Linux和BSD机器也会这样做。

  3. 如果计算机正在运行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.localCanon._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]

  4. 在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项目的来源。

  5. 您也可以使用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上的第一个例&#x5B50;

如果是这样,它究竟是如何工作的。 我的程序如何从Bonjour获得这些信息? 我的程序是否可以读取由Bonjour创build的文件,并包含上述信息? 我可以在命令行中使用一些命令来检索这些信息吗?

使用适当的库,该程序使用Bonjour协议来请求本地networking中的所有其他计算机告诉它有哪些可用的服务。 那么这个图书馆会parsing这些回复,并以更有用的格式呈现给你。

我特别感兴趣的是通过命令行访问文件,环境variables或命令中的服务信息。 这些选项在我看来是最简单的! 因为在这种情况下,我不需要使用任何额外的库来从特定的编程语言与Bonjour进行通信。

我不知道这样做的工具,但它可能存在。

PS请问如果我的问题中有些问题不清楚,请提出问题。 我会试图以更清晰的方式来提出我的问题。

有关您正在编写的程序的更多信息,以及您正在使用什么语言编写,将使其更容易帮助。

有关更多介绍性信息,请尝试两种方法:

  • 苹果FAQ: http : //developer.apple.com/networking/bonjour/faq.html
  • 维基百科页面: http : //en.wikipedia.org/wiki/Bonjour_(software)

Bonjour不分配IP地址 – 这是一个发现协议 – 你仍然需要DHCP /静态/链接本地(APIPA)IP地址才能正常工作。

它使用多播DNS(mDNS)来发现与同一个广播域上的主机是什么,它本身就是它自己的DNS服务器。

见下面的Bonjour & Zeroconf 。

除非你的应用程序是一个家庭/不可pipe理的networking,也就是说,缺less一个本地的DNS服务器,你不需要它。