精华内容
下载资源
问答
  • Bonjour

    2021-01-07 11:33:22
    <div><p>Bonjour. Je n'arrive pas a utiliser Zibluerfplayer, il ne reconnait pas les commande chaco ni les transmetteurs de temperature oregon scientific Merci d'avance de votre soutient. clt...
  • bonjour

    2017-11-20 15:48:15
    Bonjour是苹果为基于组播域名服务(multicast DNS)的开放性零设置网络标准所起的名字,能自动发现IP网络上的电脑、设备和服务。Bonjour 使用工业标准的 IP 协议来允许设备自动发现彼此,而不需输入IP 地址或配置DNS ...
    Bonjour是苹果为基于组播域名服务(multicast DNS)的开放性零设置网络标准所起的名字,能自动发现IP网络上的电脑、设备和服务。Bonjour 使用工业标准的 IP 协议来允许设备自动发现彼此,而不需输入IP 地址或配置DNS 服务器。
    展开全文
  • bonjour

    2016-02-23 11:00:29
    +###一.Bonjour介绍   4 +一般在进行Socket编程或者网络访问的时候,首先需要确认对方网络服务已经开启,且需要知道对方的域名或地址以及端口,然后才可以进行进一步操作。在互联网上好点,网络服务方...
    +###一.Bonjour介绍
      4
    +一般在进行Socket编程或者网络访问的时候,首先需要确认对方网络服务已经开启,且需要知道对方的域名或地址以及端口,然后才可以进行进一步操作。在互联网上好点,网络服务方一般常年开启,且一般IP地址是固定的,另由于DNS服务的存在,只要记住对方的域名便可以。但是在局域网,设备不一定连在上面,即使连上了,服务也不一定开了,每当设备连接到局域网的时候,IP地址一般都是动态分配的,所以情况变的复杂。Bonjour的存在便是苹果为了解决局域网设备间连接麻烦的问题。   
      5
    +直白的说Bonjour就是是一种协议,使得局域网中的计算机可以方便的发布服务,发现服务和连接服务,达到零配置([Zeroconf][link-zeroconf])的目的。
      6
    +[link-zeroconf]:http://zeroconf.org
      7
    +
      8
    +Zeroconf Working Group指出要实现零配置网络服务的3个要求:
      9
    +
      10
    +>+ IP地址
      11
    +>+ **名字** 到 **IP地址** 的转换(即使没有DNS服务器的情况下)
      12
    +>+ 发现网络中的服务
      13
    +
      14
    +对于第一个要求相关系统和设备可以直接支持的,如动态IP地址分配。   
      15
    +第二个要求则可以通过多播(UDP协议向局域网内一组机器发送数据)的方式发送 类似DNS查询的请求,开启着的网络服务收到之后便作出回应,告知自己的名字。   
      16
    +第三个要求则通过DNS-SD来实现
      17
    +
      18
    +Bonjour一般的工作模式便是:在同一个局域网中,一方开启服务,通过Bonjour接口将这个服务发布,服务搜索方在服务列表中便可以看到对应的设备的名字,选择设备便可以进行连接了。整个过程无需事先知道服务发布方的IP地址和端口号。   
      19
    +我们常用的软件如iTunes的共享,keynote的remote控制或者支持Bonjour协议的打印机都可以看到Bonjour的影子。
      20
    +
      21
    +
      22
    +###二.Bonjour的实现及使用
      23
    +从上面的描述可以看出,Bonjour的用途便是在局域网内发布服务和搜索服务。
      24
    +下面从实现层面讲解Bonjour。  
      25
    +
      26
    +|层次|名称|
      27
    +|:----|:----|
      28
    +|Foundation|NSNetService/NSNetServiceBroswer|
      29
    +|CoreFoundation|CFNetService/CFNetServiceBroswer|
      30
    +|Low-Level Socket Based API|dns_sd.h(The DNS Service Discovery API)|
      31
    +|Multicast DNS Responder|mDNSResponder (开源项目)|
      32
    +
      33
    +一般情况下我们使用Foundation这一层接口就可以了,也是最方便的。
      34
    +当然服务方在发布服务之前你得先启好网络服务,比如listening socket创建好,且开始侦听某个端口,关于socket编程的知识可以查看[Socket编程][link-socket]  
      35
    +
      36
    +[link-socket]:Socket编程.md   
      37
    +
      38
    +**1.发布服务**
      39
    +
      40
    +  netService = [[[NSNetService alloc] initWithDomain:@""
      41
    +                                                type:@"_test._tcp"
      42
    +                                                name:@""
      43
    +                                                port:port] autorelease];
      44
    +  if(netService != nil) {
      45
    +      [netService scheduleInRunLoop:[NSRunLoop currentRunLoop]
      46
    +                                 forMode:NSRunLoopCommonModes];
      47
    +      netService.delegate = self;
      48
    +      [netService publish];
      49
    +  }
      50
    +
      51
    +**2.浏览服务**
      52
    +  
      53
    ++ 创建Service Broswer, 需要指定service type和domain,得和发布服务时候的type对应。还得设置delegate,然后实现其delegate方法,以便发现了服务之后进行处理以及对发现的服务进行获取IP地址和端口的结果进行处理。
      54
    +
      55
    +
      56
    +    testServiceBrowser = [[NSNetServiceBrowser alloc] init];
      57
    +    testServiceBrowser.delegate = self;
      58
    +    [testServiceBrowser searchForServicesOfType:@"_test._tcp" inDomain:@""];
      59
    +
      60
    +
      61
    ++ 实现Service Broswer 的delegate方法,处理服务增加或减少的事件
      62
    +
      63
    +
      64
    +    //pragma mark NetServiceBroswer Delegate
      65
    +    - (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser
      66
    +               didFindService:(NSNetService*)service
      67
    +                   moreComing:(BOOL)moreComing {
      68
    +        [netServiceArray addObject:service];
      69
    +        if (!moreComing) {
      70
    +            [serviceTableView reloadData];
      71
    +        }
      72
    +    }
      73
    +  
      74
    +    - (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser
      75
    +             didRemoveService:(NSNetService*)service
      76
    +                   moreComing:(BOOL)moreComing {
      77
    +        [netServiceArray removeObject:service];
      78
    +        if (!moreComing) {
      79
    +            [serviceTableView reloadData];
      80
    +        }
      81
    +    }
      82
    +    
      83
    +    
      84
    ++ 连接服务
      85
    +
      86
    +上面发现的Net Service是不带IP地址和端口信息的。   
      87
    +从服务列表中选择一个已经发现的服务,进行Resolve,便可以获取服务的详细信息了。
      88
    +
      89
    +  - (IBAction)connect:(id)sender{
      90
    +      NSUInteger selectedRow = [serviceTableView selectedRow];
      91
    +      NSNetService *selectedServiece = [netServiceArray objectAtIndex:selectedRow];
      92
    +      selectedServiece.delegate = self;
      93
    +      [selectedServiece resolveWithTimeout:5.0];
      94
    +  }
      95
    +  
      96
    +Resolve成功
      97
    +
      98
    +  //NSNetService Delegate
      99
    +  - (void)netServiceDidResolveAddress:(NSNetService *)sender{
      100
    +        NSLog(@"service ip:%@ port:%d",sender.address,sender.port);
      101
    +    if ([sender getInputStream:&inputStream outputStream:&outputStream]) {
      102
    +        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
      103
    +                                         forMode:NSDefaultRunLoopMode];
      104
    +        [outputStream open];
      105
    +        //发送数据
      106
    +        NSData *helloData = [@"Hello" dataUsingEncoding:NSUTF8StringEncoding];
      107
    +        [outputStream write:[helloData bytes] maxLength:[helloData length]];
      108
    +    }
      109
    +  }
      110
    +  
      111
    +上面的代码充分利用了输入输出流进行通信。如果你自己的使用socket的连接也是可以的,因为这个时候已经可以获取了对方的IP地址和端口了。
         

    转载自: https://github.com/kejinlu/objc-doc/commit/154ea6af4f281c80453d9e00c348a43075d6d2fe#L1R14
    展开全文
  • Bonjour 你好

    2021-01-19 17:42:48
    Bonjour 你好< 比较正式和礼貌> Salut 你好< 朋友或熟人之间> Bonsoir 晚上好Bonjour/Salut àtous 大家好 Comment allez-vous? 怎么样、还
  • Bonjour.rar

    2020-10-31 09:26:15
    安装Windows迁移助手时,因为资源问题,会卡在安装Bonjour步骤。提前手动安装bonjour,可以保证迁移助手顺利完成安装。
  • Bonjour improvements

    2020-12-29 05:51:24
    <div><p>This Pull Request aims to improve the bonjour name uniqueness by appending the 4 first digits of the accessoryID. Also, it tests the availability of an IP address before transmitting the mdns ...
  • bonjour veryhuo

    2013-10-26 15:05:17
    苹果bonjour服务,下载后直接双击下载
  • Bonjour SDK 3.0

    2017-07-05 22:25:20
    Apple official Bonjour SDK 3.0
  • Bonjour Service

    2021-01-13 17:45:07
    1.Bonjour概念: 为什么会出现Bonjour?在过去的二十年中,计算机逐渐从平台特定的协议(如AppleTalk,IPX和NetBIOS)过渡到了Internet协议(IP)。大多数计算机和其他网络设备都使用TCP / IP进行通信。但是,在此...

     

    1.Bonjour概念:

    为什么会出现Bonjour?在过去的二十年中,计算机逐渐从平台特定的协议(如AppleTalk,IPX和NetBIOS)过渡到了Internet协议(IP)。大多数计算机和其他网络设备都使用TCP / IP进行通信。但是,在此过渡过程中,丢失了一项功能-能够将设备添加到本地网络,然后从计算机和网络上的其他设备连接到那些设备的功能,而这些功能几乎不需要进行任何配置。

     

    为了使IP设备正常工作,每个设备都需要一个唯一的地址,无论该地址是由DHCP服务器动态分配还是手动分配。动态分配的地址可以更改,因此,在没有Bonjour的情况下,必须手动为打印机和其他设备配置静态地址,以便网络上的计算机可以访问它们。然后,网络管理员必须配置DNS服务器,以便计算机用户不必通过IP地址连接到打印机。因此,看似很简单的事情需要大量的配置。因为不适合网络管理员传统角色的人们经常建立网络(例如,家庭通过共享路由器将笔记本电脑连接到Internet),因此这种配置水平是不切实际的。甚至在由IT专业人员运行的托管网络中,对打印机等设备进行手动配置也是没有意义的。人们希望能够插入打印机,将两台笔记本电脑连接在一起,或者在本地网络上查找文件服务器或游戏服务器,而不会浪费时间尝试正确配置。

    为此,人们需要一种简单可靠的方法来配置和浏览IP网络上的服务。他们希望发现可用的服务并从列表中选择一种,而不必事先知道每种服务的名称或IP地址。 IP具有此功能符合每个人的利益。这正是Bonjour提供的功能。

    零配置例子:

    零配置IP网络具有巨大的潜力。 考虑我们的日常打印任务, 在计算机或iOS设备上配置了打印机后,只需选择应用程序的“打印”命令即可。

    将笔记本电脑带到客户的公司或邻居的房子,然后尝试打印一些东西。 如果他们有一台支持Bonjour协议的打印机,则打印和在本地网络上一样容易。 要进行打印,请将便携式计算机连接到客户的Wi-Fi接入点,然后启动便携式计算机。 或者启动您的笔记本电脑,它会立即找到邻居的家庭无线网络。 无论哪种方式,笔记本电脑都会自动发现任何可用的打印机。 您打开文档,选择“打印”命令,每个可用的打印机都会出现在“打印”对话框中。 您选择打印机,单击打印,然后打印文档。

    或者说您想和朋友一起玩网络游戏。您打开游戏,您朋友的游戏副本会立即在网络上看到您的副本。或者,如果您在两台计算机上都有音乐共享应用程序,则程序本身可以发现彼此并立即交换歌曲列表。同样,如果您具有共享文件夹或打开了个人Web共享,则共享文件和Web页面将立即对其他用户可用。

    Addressing:

    通过自分配的链路本地寻址解决了寻址问题。 链路本地寻址使用为本地网络保留的一系列地址,通常是小型LAN或单个LAN网段。 为此,IPv6规范包括自分配的链路本地寻址作为协议的一部分。 零配置网络中的主要解决挑战是将该功能改装为IPv4。

    注意:IPv6链接本地寻址比IPv4链接本地寻址更简单,因此更可靠。 因此,您的应用程序支持IPv6非常重要。

    在IPv4中,自分配寻址通过在链路本地范围内选择一个随机IP地址并对其进行测试来工作。 如果该地址未被使用,它将成为您的本地地址。 如果已经在使用它,则计算机或其他设备会随机选择另一个地址,然后重试。

    Naming:

    提议的用于本地网络上名称到地址转换的解决方案使用多播DNS(mDNS),其中DNS格式查询是使用IP多播通过本地网络发送的。 因为这些DNS查询被发送到多播地址,所以不需要具有全局知识的单个DNS服务器来回答查询。 每个服务或设备都可以提供自己的DNS功能-当看到自己名称的查询时,它将提供带有自己地址的DNS响应。

    Bonjour再进一步讲。 它包括一个响应程序,用于处理主机或iOS设备上任何网络服务的mDNS查询。 这使您的应用程序无需解释和响应mDNS消息。 通过注册您的服务,Bonjour mDNSResponder守护程序会自动通告您的服务可用性,以便对您的姓名的任何查询都将自动定向到正确的IP地址和端口号。

    注意:使用Bonjour API之一进行注册。 此功能仅适用于在主机计算机或iOS设备上运行的服务。 在其他设备(例如打印机)上运行的服务需要实现一个简单的mDNSResponder守护程序,该守护程序处理对该设备提供的服务的查询。

    Bonjour还为NAT端口映射协议(NAT-PMP)提供内置支持。如果上游路由器支持此协议,则OS X和iOS应用程序可以创建和穿过端口映射,以允许防火墙另一侧的主机连接到所提供的服务。

    为了使名称到地址的转换正常工作,必须在本地网络上使用唯一的名称。与常规DNS主机名不同,本地名称仅在本地网络或LAN网段上具有重要性。您可以使用与自行分配本地地址相同的方式自分配本地名称。如果尚未使用,则:

    硬件制造商通过让其设备向该名称发送mDNS查询并寻找任何响应来确定其所选名称是否已被使用。如果有响应,则设备应选择其他名称。没有用户界面的设备会在默认名称后添加一个更大的数字,直到该名称唯一为止。例如,如果默认名称为XYZ-LaserPrinter.local的打印机连接到已经安装了另外两台相同打印机的本地网络,则它将测试XYZ-LaserPrinter.local,XYZ-LaserPrinter-2.local,然后XYZ-LaserPrinter -3.local未使用,那么它就成为其名称。

    在Bonjour注册时,软件服务会提供一个名称。如果提供的名称已被使用,Bonjour将默认自动为您重命名服务。

    Service Discovery:

    Bonjour的最后一个服务是服务发现。服务发现允许应用程序查找特定类型服务的所有可用实例,并维护已命名服务和端口号的列表。然后,应用程序可以将服务主机名解析为IPv4和IPv6地址的列表,如命名中所述。

    命名服务列表提供了服务与其当前DNS名称和端口号之间的间接层。间接允许应用程序保留可用服务的持久列表,并在使用服务之前解析实际的网络地址。该列表使服务能够动态重定位,而不会产生大量网络流量来宣布更改。

    Bonjour中的服务发现是通过“浏览”完成的。将发送给定服务类型和域的mDNS查询,所有匹配的服务均会使用其名称进行回复。结果是可用服务列表。

    这与传统的以设备为中心的网络服务理念大不相同。对于处理服务器,网络设备和网络编程的人来说,很容易养成在物理硬件方面考虑服务的习惯。在以设备为中心的视图中,网络由许多设备或主机组成,每个设备或主机都有一组服务。例如,网络可能由一台服务器计算机和几台客户端计算机组成。在以设备为中心的浏览方案中,客户端向服务器查询服务器正在运行的服务,并获取列表(FTP,HTTP等),并确定要使用的服务。该界面反映了物理系统的组织方式。但这不一定是用户逻辑上想要或需要的。

    用户通常希望完成某些任务,而不是查询设备列表以查找正在运行的服务。客户提出一个问题:“可以使用哪些打印服务?”更有意义。而不是向每个可用设备查询“您正在运行哪些服务?”这个问题。并筛选搜索打印机的结果。以设备为中心的方法不仅耗时,而且会产生大量的网络流量,其中大部分是无用的。以服务为中心的方法发送单个查询,仅生成相关的答复。

    此外,服务不绑定到特定的IP地址甚至主机名。例如,一个网站可以由具有不同地址的多个服务器托管。在组织内部,网络管理员可能需要将服务从一台服务器移至另一台服务器,以帮助平衡负载。如果客户端存储了主机名(就像现在大多数情况下一样),则当服务移至其他主机时,它们将无法连接。

    Bonjour采取面向服务的观点。查询是根据所需的服务类型而不是提供它们的主机进行的。应用程序存储服务实例名称,而不存储地址,因此,如果IP地址,端口号甚至主机名已更改,应用程序仍可以连接。通过专注于服务而非设备,用户的浏览体验将变得更加有用和无障碍。

    Bonjour如何减少资源消耗?

    不依赖服务器的寻址,命名和服务发现有可能产生大量多余的网络流量,但Bonjour采取了许多步骤将这种流量降至最低。 这样,Bonjour可以实现AppleTalk的易用性,同时避免任何不必要的“笨拙”。

    Bonjour利用多种机制来减少零配置开销,包括缓存,抑制重复响应,指数退避和服务通告,如以下各节所述。

     

    Caching(缓存)

    Bonjour使用多播DNS记录的缓存来防止主机请求已被请求的信息。 例如,当一个主机请求一个LPR打印后台处理程序列表时,打印机列表通过多播返回,因此所有本地主机都可以看到它。 主机下次需要打印后台处理程序列表时,其缓存中已经具有该列表,不需要重新发出查询。 组播DNS响应者负责维护缓存; 应用程序开发人员无需做任何维护工作。

    抑制重复响应:

    为了防止重复回答同一查询,Bonjour服务查询包括已知答案的列表。 例如,如果主机正在浏览打印机,则第一个查询不包含任何打印服务,并且例如从可用的打印服务器中获得十二个答复。 主机下次查询打印服务时,查询将包括已知服务器列表。 列表中已有的打印服务器不响应。

    Bonjour用另一种方式抑制重复的响应。 如果一个主机将要响应,并且注意到另一个主机已经以相同的信息进行响应,则该主机将抑制其响应。

    应用程序开发人员无需采取任何措施来抑制重复的响应。 Bonjour处理重复响应抑制

    指数退避和服务通告

    主机浏览服务时,它不会连续发送查询以查看新服务是否可用。 而是,主机发出初始查询,并以较少的频率按指数形式发送后续查询,例如:1秒,3秒,9秒,27秒等之后,最大间隔为一小时。

    这并不意味着浏览器要花费一个多小时才能看到新服务。 当服务在网络上启动时,它会使用类似的指数补偿算法几次宣布其存在。 这样,用于服务通告和发现的网络流量将保持在最低限度,但是很快就能看到新服务。

    在具有Bonjour的主机上运行的服务在向mDNSResponder守护程序注册时会自动宣布。 在其他硬件(例如打印机)上运行的服务应实施带有指数补偿的服务公告,以充分利用Bonjour的优势。

     

    2.Domain Naming Conventions(命名规定)

    Bonjour and the Local Link:

    Bonjour协议在很大程度上处理了称为本地链接的网络部分。主机的本地链路或链路本地网络包括其自身和所有其他主机,这些主机可以交换数据包而无需修改IP标头数据。实际上,这包括所有未由路由器分隔的主机。

    在Bonjour系统上,local.用于表示应使用本地IP网络上的IP多播查询查找的名称。

    注意local.并不是一个真正的领域。您可以想到local.作为伪域。它与传统的DNS域在根本上不同:其他域中的名称是全局唯一的;链接本地域名​​不是。世界上只有一个逻辑DNS条目,名为www.apple.com。,并且由于DNS的工作方式,因此只能有一个。另一方面,以local.结尾的主机名是由本地网络上的一组多播DNS响应程序管理的,因此命名范围就是:local.可以轻松地生成两个名为meow.local的主机。在世界上,甚至在同一座建筑物上,只是不在同一本地网络上。

    如果在本地网络上发生名称冲突,则Bonjour主机会自动找到新名称(对于iOS或没有屏幕的任何设备)或询问用户(对于个人计算机)。

    Bonjour和单播DNS

    除了多播DNS,Bonjour还支持使用广域Bonjour通过传统单播DNS进行广告和发现服务。 单播DNS不在本文档范围内。 要了解有关配置与Bonjour一起使用的单播域名服务器的更多信息,请访问DNS-SD网站。

    现有服务类型的Bonjour名称

    Bonjour服务是根据IP服务的现有Internet标准命名的(在RFC 2782中进行了描述)。 Bonjour服务名称将服务类型和传输协议结合在一起以形成注册类型。 注册类型用于注册服务并为其创建DNS资源记录。 为了区分DNS资源记录中域名的注册类型和域名,注册类型使用下划线前缀分隔组成注册类型的组件。 格式为

    _ServiceType._TransportProtocolName。

    服务类型是该服务在IANA上注册的官方名称,例如ftp,http或打印机。 传输协议名称为tcp或udp,取决于服务使用的传输协议。 通过TCP运行的FTP服务的注册类型为_ftp._tcp,主机的多播DNS响应器会注册一个名为_ftp._tcp.local的DNS PTR记录 。

    服务实例的Bonjour名称

    服务实例名称旨在为人类可读的字符串。这样您应该用描述性的方式命名它们,并让用户覆盖您提供的任何默认名称。因为服务实例名称是供浏览而不是键入的,所以它们可以是使用UTF-8编码的任何Unicode字符串,长度最多为63个八位字节(字节)。

    例如,默认情况下,用于通过网络共享音乐的应用程序可能会将本地用户的名称用于音乐共享服务,例如Émille的音乐库。用户可以覆盖默认设置,并将服务命名为Zealous Lizard的Tune Studio,并且该应用程序将注册名为Zealous Lizard的Tune Studio._music._tcp.local。的DNS SRV记录,前提是该应用程序的音乐共享协议与名称music相关联。

    如图说明了Bonjour服务实例名称的组织。树的顶层是域,例如local.用于本地网络。域下方是注册类型,该注册类型由以下划线(_music)之前的服务类型和下划线(_tcp)之后的传输协议组成。树的底部是易于理解的服务实例名称,例如Zealous Lizard的Tune Studio。全名是沿着树从下到上的路径,每个组件之间用点分隔。

     

     

     

    3.Bonjour API架构接口

    OS X和iOS为Bonjour服务应用程序提供了多层应用程序编程接口(API):Foundation框架中的NSNetService和NSNetServiceBrowser类; CFNetServices,是核心服务中CFNetwork框架的一部分; Java的DNS服务发现(仅OS X); 以及围绕BSD套接字构建的低级DNS服务发现API。 所有这三个API集都提供了用于发布,发现和解析网络服务的功能。 图3-1说明了API层的结构。 如您所见,多播DNS响应器(或其他DNS服务器)位于最低级别,因此您的软件不必直接与DNS交互。

     

     

    NSNetService和NSNetServiceBrowser

    NSNetService和NSNetServiceBrowser类是Cocoa Foundation框架的一部分,为服务发现和发布提供了面向对象的抽象。 NSNetService对象代表Bonjour服务的实例,用于发布或由客户端发现的服务,而NSNetServiceBrowser代表用于特定类型服务的浏览器。 大多数可可程序员应该发现这些类足以满足他们的需求。 如果需要更详细的控制,则可以从Cocoa应用程序中使用DNS服务发现API。

    NSNetService和NSNetServiceBrowser被安排在默认的NSRunLoop对象上,以异步执行发布,发现和解析。 NSNetService和NSNetServiceBrowser对象返回的所有结果均由委托对象处理。 这些对象必须与运行循环关联才能起作用,但不一定是默认对象。

    CFNetServices

    在核心服务框架中声明的CFNetServices API提供了用于管理服务和服务发现的Core Foundation样式类型和功能。 CFNetServices定义了三种Core Foundation对象类型,即CFNetService,CFNetServiceBrowser和CFNetServiceMonitor。 CFNetService是服务实例的抽象表示,可以用于发布或使用。关联功能为发布和解决服务提供支持。 CFNetServiceBrowser代表用于特定域中特定类型服务的浏览器。通常,只有在OS X或iOS的Core Foundation层上编写代码时,才应使用此API。

    CFNetService和CFNetServiceBrowser对象通常都在CFRunLoops中提供服务。为了检索结果,应用程序实现回调函数来处理事件,例如新服务的出现或消失,正在解析的实例以及发生的错误。与NSNetService和NSNetServiceBrowser不同,CFNetServices类型不需要运行循环,并且在需要此行为时可以同步运行。但是,不好的做法是使用这些功能的同步模式。

    DNS服务发现

    在/usr/include/dns_sd.h中声明的DNS服务发现API为Bonjour服务提供了低级BSD套接字通信。 DNS服务发现充当软件与多播DNS响应器或DNS服务器之间的中间层。 它为您管理多播DNS响应器,使您可以根据服务和服务浏览器而不是DNS资源记录来编写程序。

    由于DNS服务发现API是Darwin开源项目的一部分,因此在编写跨平台代码(仅适用于iOS和OS X以外的平台)或需要使用更高版本中不可用的低级功能时,应使用它更高级别的API,例如NSNetService。

    如果为Windows,Linux或FreeBSD开发Bonjour服务应用程序,则DNS服务发现也是应使用的API。

     

    4.Bonjour Operations

    本小节描述了服务发布,浏览和解析的Bonjour操作,它们是三个网络服务API层以及API层本身的基础。如果要编写发布或发现网络服务的应用程序或工具,则应阅读本小节

    体系结构概述

    Bonjour中的网络服务体系结构包括一种易于使用的机制,用于发布,发现和使用基于IP的服务。 Bonjour支持三个基本操作,每个基本操作都是零配置网络服务的必要部分:

     

    发布(广告服务)

    发现(浏览可用服务)

    解析(将服务实例名称转换为地址和端口号以供使用)

    以下各节将详细讨论这些操作:

     

    发行:

    要发布服务,应用程序或设备必须通过高级API或直接与响应者(mDNSResponder)通信,向多播DNS响应者注册该服务。 Bonjour还支持使用动态DNS更新在常规DNS服务器上存储记录。

    注册服务后,将创建三个相关的DNS记录:服务(SRV)记录,指针(PTR)记录和文本(TXT)记录。 TXT记录包含解决或使用服务所需的其他数据,尽管它通常也为空。

     

    服务记录(SRV):

    SRV记录将服务实例的名称映射到客户端实际使用服务所需的信息。然后,客户端将服务实例名称存储为访问服务的一种持久方式,并在连接时对主机名和端口号执行DNS查询。这种间接的附加级别提供了两个重要功能。首先,该服务由通俗易懂的名称而不是域名和端口号标识。其次,即使服务的端口号,IP地址或主机名发生更改,客户端也可以访问该服务,只要该服务名保持不变即可。

     

    SRV记录包含两条信息以标识服务:

    主机名

    端口号

     

    主机名是当前可以找到服务的域名。给出主机名而不是单个IP​​地址的原因是,它可以是具有多个IP地址的多宿主主机,也可以具有IPv6地址和IPv4地址,依此类推。通过名称识别主机可以妥善处理所有这些情况。端口号标识服务的UDP或TCP端口。

    SRV记录根据以下约定命名:

    <Instance Name(实例名称)>.<Service Type(服务类型)>.<Domain(域)>

    <Instance Name>(服务实例的名称)可以是任何UTF-8编码的Unicode字符串,并且旨在使人可以轻松阅读。

     

    <Service Type>是一个标准IP协议名称,后跟一个下划线,然后是主机到主机传输协议(TCP或UDP),后跟一个下划线。例如,在UDP上运行的普通FTP服务的服务类型为_tftp._udp,在TCP上运行的IPP打印服务将注册在_ipp._tcp服务类型下。官方协议名称列表由IANA维护;有关更多信息,请参见域命名约定。

     

    <Domain>是一个标准的DNS域。这可能是特定域,例如apple.com.或通用后缀local.只能在本地链接上访问的服务。

     

    这是在TCP端口515上运行的名为PrintsAlot的打印后台处理程序的SRV记录(以标准DNS记录格式)的示例:

     

    PrintsAlot._printer._tcp.local. 120 IN SRV 0 0 515 blackhawk.local。

     

    该记录将在名为blackhawk.local的打印机的多播DNS响应器上创建。在本地链接上。初始值120表示生存时间(TTL)值,用于缓存。两个零是权重和优先级值,当在多个与给定名称匹配的记录之间进行选择时,在传统DNS中使用;对于多播DNS,将忽略这些值。

     

    指针记录(PTR记录)

    PTR记录通过将服务类型映射到该服务类型的特定实例的名称列表来启用服务发现。该记录增加了另一层间接性,因此仅通过查找标有服务类型的PTR记录就可以找到服务。

     

    该记录仅包含一条信息,即服务实例的名称(与SRV记录的名称相同)。因此,PTR记录的命名方式与SRV记录类似,但没有实例名称:

     

    <Service Type>.<Domain>

     

    这是一个名为PrintsAlot的打印后台处理程序的PTR记录示例:

     

    _printer._tcp.local. 28800 PTR PrintsAlot._printer._tcp.local。

     

    同样,28800是生存时间(TTL)值,以秒为单位。

     

    文字记录(TXT记录)

    TXT记录与相应的SRV记录具有相同的名称,并且可以包含少量有关服务实例的附加信息,通常最多不超过100-200个字节。该记录也可能为空。例如,网络游戏可以广告多人游戏中使用的地图的名称,而聊天程序可以广告用户的可用性(例如,空闲,离开或可用)。如果需要传输大量数据,主机应与客户端建立连接并直接发送数据。

     

    从历史上看,此记录已用于在同一端口上以相同IP地址运行的多个服务,例如,在同一打印服务器上运行的多个打印队列。在这种情况下,TXT记录中的其他信息可用于标识预期的打印队列,如本示例所示:

     

    这种做法是必要的,因为历史上服务类型已经与众所周知的端口相关联。鼓励Bonjour协议新的设计者在不同的动态分配的端口号上运行其服务,而不是尝试在相同的知名端口号上全部运行它们,并使用额外的信息来指定客户端尝试与之通信。

     

    TXT记录中数据的性质和格式特定于每种服务类型,因此每种新服务类型还需要为其关联的TXT记录(如果有)定义数据格式,并将该格式发布为协议规范。

    Publication:一个例子

    举一个具体的例子,假设一个在本地网络上共享音乐的虚拟设备—支持IP的自动点唱机。假设其传输协议为TCP,并且其应用协议的名称为music。当有人将设备插入以太网集线器时,会发生很多事情,如图所示。

     

    在步骤1中,设备从子网掩码为255.255.0.0的IPv4本地链接范围169.254.0.0中随机选择本地链接IP地址169.254.150.84,并将其发布给网络。因为没有设备响应该通知,所以设备会将地址作为自己的地址。在步骤2中,它启动其自己的mDNS响应器,请求主机名eds-musicbox.local.,验证其可用性,并将其名称用作其自身。接下来,在步骤3中,设备在TCP端口1010上启动音乐共享服务。最后,在步骤4中,设备在本地域以Ed's Party Mix名称发布类型为_music._tcp的服务。注意首先确保不存在使用相同名称的服务,这将创建两个记录:

     

    一个名为Ed’s Party Mix._music._tcp.local的SRV记录,在TCP端口1010上指向eds-musicbox.local.service 

    一个名为_music._tcp.local的PTR记录指向Ed's Party Mix._music._tcp.local.service

    注意:发布服务时,如果域名或服务名称不可用,则没有接口的设备应选择一个新名称。 遇到这种情况的应用程序软件应提供一个用户界面,通知用户该名称不可用,并应允许用户选择其他名称。

    Discovery:

    服务发现利用服务发布期间注册的DNS记录来查找特定服务类型的所有命名实例。 为此,应用程序通常通过更高级别的API对与服务类型(例如_http._tcp)匹配的PTR记录执行查询。 在每个设备上运行的mDNS响应器返回带有服务实例名称的PTR记录。

    图4-2说明了浏览音乐共享服务的客户端应用程序。 在步骤1中,客户端应用程序发出对本地域_music._tcp类型的服务的查询到标准多播地址224.0.0.251。 网络上的每个mDNS响应器都听到请求,但是只有音乐共享设备会以PTR记录进行响应(步骤2)。 生成的PTR记录包含服务实例名称Ed的Party Mix._music._tcp.local。 在这种情况下。 然后,客户端应用程序可以从PTR记录中提取服务实例名称,并将其添加到音乐服务器的屏幕列表中。

    Resolution

    服务发现通常仅偶尔进行一次,例如,当用户首次选择打印机时。此操作将保存服务实例名称,即任何给定服务实例的预期稳定标识符,端口号,IP地址甚至主机名每天都可以更改,但是用户不必每次都重新选择打印机。因此,直到真正使用该服务,才从服务名称解析为套接字信息。

    为了解析服务,应用程序使用服务名称对SRV记录执行DNS查找,mDNS响应器以包含当前信息的SRV记录进行响应。

    如图说明了音乐共享示例中的服务解析。解决过程始于对多播地址224.0.0.251的DNS查询,询问Ed's Party Mix._music._tcp.local. SRV记录(步骤1)。在第2步中,此查询返回服务的主机名和端口号(eds-musicbox.local。,1010)。在步骤3中,客户端发出对IP地址的多播请求。在步骤4中,此请求解析为IP地址169.254.150.84。然后,客户端可以使用IP地址和端口号连接到服务。每次使用该服务时都会执行此过程,从而始终查找该服务的最新地址和端口号。

     

     

     

     

     

    5.Bonjour常见的问题:

     

    1.什么是bonjour?

    Bonjour,也称为零配置网络,可在IP网络上自动发现计算机,设备和服务。 Bonjour使用行业标准IP协议,使设备无需输入IP地址或配置DNS服务器即可自动发现彼此。具体来说,Bonjour可以在没有DHCP服务器的情况下自动分配IP地址,在没有DNS服务器的情况下实现名称到地址的转换以及在没有目录服务器的情况下进行服务发现。 Bonjour是一种开放协议,Apple已将其提交给IETF,作为正在进行的标准创建过程的一部分。要了解更多信息,请查看Bonjour协议规范,其中详细说明了组成本地链接和广域Bonjour的技术。

     

    2.什么是mDNSResponder?

    mDNSResponder是Bonjour系统服务,该服务实现多播DNS服务发现以在本地网络上发现服务,并实现单播DNS服务发现以在世界上任何地方发现服务。 mDNSResponder内置于OS X和iOS中,可以作为Bonjour for Windows的一部分进行下载。 iTunes,iPhoto,Messages和Safari等应用程序使用mDNSResponder来实现零配置网络音乐共享,照片共享,聊天和文件共享以及为打印机和网络摄像头等硬件设备发现远程用户界面。 mDNSResponder还用于发现并打印到Bonjour打印机和连接到AirPort Extreme和Express基站的USB打印机。 mDNSResponder是开源的,鼓励硬件设备制造商将mDNSResponder源代码直接嵌入其产品中,以从零配置网络中受益。

     

    3. Bonjour是否在多个子网之间工作?

    是, OS X的DNS服务发现(DNS-SD)的第一版集中于单链路网络的多播DNS(mDNS),因为这是IP软件最糟糕的环境。 Bonjour使用动态DNS更新(RFC 2316)和单播DNS查询来启用广域服务发现。

     

    4.当我从网络断开设备时,它仍然可见吗?

    是的,有一阵子。最终,DNS记录达到其生存时间间隔并消失。作为应用程序开发人员,如果使用Bonjour连接到主机,但连接失败,则可以要求Bonjour重新确认记录。 《 NSNetServices和CFNetServices编程指南》中进一步描述了此过程。

     

    5.在iOS中如何通过蓝牙支持Bonjour?

    在iOS 5及更高版本中,应用必须明确选择通过蓝牙进行服务发现,并且必须使用低级DNS服务发现C API解析服务。有关更多信息,请参阅iOS 5及更高版本上的通过蓝牙Bonjour。

     

    6.我应该让服务浏览器运行多长时间?

    浏览器会消耗资源,因此,如果您不希望使用数据,则不要让它们运行。但是,在连接服务时保持服务浏览器运行通常是一个好主意。如果该连接失败,则正在运行的浏览器的存在会鼓励Bonjour更积极地重新验证潜在的过时服务条目,从而使服务列表更加准确。

    通常,如果不显示包含该列表的任何用户界面元素,并且没有主动连接到任何服务,则可能应该停止浏览器。但是,这只是一般性建议。在任何情况下,您都应该尽一切努力为用户带来最佳体验。

     

    7. Bonjour是否支持HTTP上的“ SOAP” RPC?

    是,Bonjour定义了一种用于发现服务的新协议(DNS-SD),但是,它对发现的服务类型没有任何限制。因此,您可以像发现消息伙伴和iTunes音乐库一样轻松地发现SOAP服务。换句话说,Bonjour支持SOAP over HTTP以及位于TCP / IP或UDP / IP之上的所有其他应用程序协议。

     

    8. Bonjour是否有某种订阅或通知机制?

    是,许多人似乎不知道Bonjour也进行通知的原因可能是因为它只是发现协议的固有属性。使用精心设计的发现协议,用于发现某些信息的相同协议也将用于发现对该信息的更改。静态信息的发现,可变信息的发现,以及可变信息何时发生变化都只是同一频谱上的不同点。有关使用Bonjour“通知”的应用程序的示例,请查看消息。当您将“状态”从“可用”更改为“离开”或键入状态消息时,本地网络上的所有其他“消息”客户端都会收到更改通知。

    《 NSNetServices和CFNetServices编程指南》中进一步描述了此技术。

     

    9.注册服务时应为“ name”参数传递什么?

    默认情况下,您应该选择一个易于理解的名称来唯一描述服务。例如,iTunes通过结合计算机用户的名字和姓氏来选择默认的音乐共享名,如“艾萨克·牛顿的音乐”中所示。对于大多数硬件设备,默认服务名称应为产品的完整品牌和型号。例如,诸如“ Apple MacBook Pro”之类的东西。请记住,这只是开箱即用的默认名称,应该允许用户自定义服务名称以区分网络上的多个设备或服务。

    对于正在注册服务的OS X应用程序开发人员,在给定的计算机上拥有该服务的一个实例(而不是可能在多个帐户中运行的每个应用程序实例都可以)是有意义的。在这种情况下,与其让您的应用程序呈现其自己的用户界面以供用户输入所宣传服务的名称,不如使用系统提供的默认名称(共享首选项中的“计算机名称”)进行注册更为方便。面板。如果在注册时输入服务名称的空字符串(“”),则系统将自动使用“计算机名称”。传递空字符串还可以通过在名称末尾自动附加一个数字来处理名称冲突。

    但是,有些服务可能在同一台计算机上托管多个实例。例如,具有三台打印机的打印服务器应将每台打印机作为一流实体进行广告宣传。应该使用有用地标识打印机本身的描述性名称来宣传每台打印机。这很重要,因为将来称为“ Marketing's Transparency打印机”的打印机可能会移至其他打印服务器,但是用户不必知道这些操作细节。他们仍然应该看到在网络上以相同名称发布的相同服务,即使它现在位于不同的打印服务器上。

     

    10.注册服务时应为“ type”参数传递什么?

    您必须传递格式为“ _applicationprotocol._transportprotocol”的字符串。当前,“ _ transportprotocol”必须为“ _tcp”或“ _udp”。您的“ applicationprotocol”必须为15个字符或更少,并应向IANA注册,以便他们可以将您添加到已注册协议名称和端口号的列表中。

    11.注册服务时应为“ domain”参数传递什么?

    如果传递一个空字符串(“”),则将使用本地链接多播和用户选择的单播DNS域(如果适用)注册服务。

    如果您传递“本地”,则仅使用链接本地多播注册您的服务,而不在任何用户选择的单播DNS域中注册您的服务。

    除“本地”域外,仅当您出于某些特殊原因想要在特定的远程域中注册服务时,才需要传递特定的字符串。

     

    12.如果网络上的两个设备都使用相同的服务名称,该怎么办?

    在极少数情况下会发生名称冲突,您的设备应在名称末尾添加一个数字,例如:

    “ Apple Mac mini(2)”

    发生名称冲突时,调用Bonjour API(例如DNSServiceRegister和CFNetServiceRegisterWithOptions)的应用程序和设备将自动获得此名称更改行为。对于具有屏幕并且能够输入用户的设备,您可以选择提示用户输入一个更唯一的名称,而不是附加数字。

     

    13. TXT记录的用途是什么?

    TXT记录的特定性质及其使用方式取决于服务类型。每种服务类型将定义零个或多个名称/值对,用于存储有关每个服务的元数据。这些名称/值对的格式应如“基于DNS的服务发现”的第6节中所述。同样,DNS-SD网站具有有关当前定义的通用服务类型名称/值对的信息。

     

    14.用户在我的应用程序中浏览网络并选择他们希望使用的服务实例后,我应该将该IP地址保存在我的应用程序的首选项文件中,对吗?

    错误,这是一个常见的错误。使用DHCP(以及链接本地寻址),不能安全地假设服务实例明天将具有相同的IP地址。地址可以更改。服务名称是服务实例的预期稳定标识符。将实例名称(名称,类型和域)保存在应用程序的首选项文件中,然后在每次用户访问服务时根据需要进行解析。还要注意,您不应存储主机名和端口号,因为您不应假定服务实例明天一定会在相同的端口号上运行。不用存储主机名,而是存储服务实例名称(名称,类型和域),然后在使用时解析服务实例名称时,请确保获取最新的IP地址和端口号。

     

    15.我的硬件设备具有用于配置的内置Web服务器。我应该使用Bonjour注册吗?

    是,您应该注册设备上运行的每个服务,例如HTTP,FTP,SSH,Telnet。在OS X上,安装了Bonjour for Windows时,Safari Web浏览器可以发现用Bonjour广告的Web服务器,而Windows上的Internet Explorer可以发现Web服务器。另外,OS X中的终端应用程序可以发现FTP,SSH和Telnet服务器。

     

    整理的不是很完善,各位看客多多见谅。

     

    展开全文
  • Bonjour CSDN

    2021-02-16 01:18:58
    碎碎语Bonjour CSDN Bonjour CSDN 投身IT十数载,不觉两鬓已染白。如今恰逢35岁这个不尴不尬的年纪,忆往昔,略叹息。曾经在IBM的技术圈子里也算如鱼得水,甲方乙方,国内国外,系统存储,技术管理,都有涉猎。如今...

    碎碎语

    Bonjour CSDN

    投身IT十数载,不觉两鬓已染白。如今恰逢35岁这个不尴不尬的年纪,忆往昔,略叹息。曾经在IBM的技术圈子里也算如鱼得水,甲方乙方,国内国外,系统存储,技术管理,都有涉猎。如今天下大变,新的技术早已把我们的生活重新塑造,我也勇敢的离开了曾经的圈子,投身新的技术领域。
    启用这里作为我写字的地方,以后就时不时在这里发发牢骚,写写心得,自我鞭策,与人共勉,偶尔凡尔赛,时常打鸡血。
    35岁,我的血依然滚烫。

    展开全文
  • 发现是一种实用程序,可显示本地网络或广域Bonjour域上的所有Bonjour服务。 以前称为Bonjour浏览器,现在已在Mac App Store中分发。 发现需要macOS 10.12或更高版本。对于旧版本的macOS,您可以下载旧版本的...
  • 编译 bonjour

    2020-07-22 10:43:21
    下载 bonjour-870.70.2:https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-878.70.2.tar.gz vs 编译 mingw 编译 (待验证) 下载 msys2: 官方下载:https://www.msys2.org/ SourceForge下载:...
  • iOS bonjour 例子

    2014-05-26 19:32:27
    iOS bonjour 例子
  • Bonjour 简介

    2016-04-14 10:43:00
    Bonjour 简介 Bonjour(法语中的你好)是一种能够自动查询接入网络中的设备或应用程序的协议。Bonjour 抽象掉 ip 和 port 的概念,让我们聚焦于更容易为人类思维理解的 service。通过 Bonjour,一个应用...
  • Bonjour.msi

    2014-01-12 15:20:35
    bonjour x32 windows 服务安装包
  • Add Bonjour Service

    2021-01-02 14:09:10
    <p>Therefore a Bonjour service should be offered. <p>The service names could be: "signalk-tcp" for the tcp service, "signalk-ws" for the WebSocket.</p><p>该提问来源于开源项目:...
  • 苹果服务bonjour

    2013-09-27 20:25:52
    bonjour windows32位系统用。
  • Bonjour SDK for Windows

    2018-03-21 16:47:59
    安装过后在C:\Program Files\Bonjour SDK\Samples有对应的开发语言sample
  • bonjour 概述

    千次阅读 2014-01-11 21:50:09
    bonjour  百科名片  Bonjour,也称为零配置联网,能自动发现IP网络上的电脑、设备和服务。Bonjour 使用工业标准的 IP 协议来允许设备自动发现彼此,而不需输入IP 地址或配置DNS 服务器。 目录  Bonjour 迅捷、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,367
精华内容 1,346
热门标签
关键字:

bonjour