如何使用Bonjour跨子网宣传服务?

时间:2010-09-20 15:16:49

标签: iphone cocoa networking bonjour dns-sd

我熟悉Bonjour在“本地”域名上的广告服务的用法。我已经完成了几个例子,并且我知道我使用的相应Cocoa类。

我很好奇我如何将简单的Bonjour服务宣传到不同的子网。具体来说,我正在尝试编写一个在我的桌面上运行的网络服务,该服务通过以太网连接。客户端在通过Wifi连接的移动设备(iPhone / iPad)上运行。在我的网络设置中,Wifi与以太网位于不同的子网上。但是,两者都落后于防火墙。我没有必要在防火墙外做广告,我只是希望wifi客户端能够看到以太网连接服务器所宣传的服务。

这可能吗?我知道Bonjour应该支持跨子网的通信,但是当我尝试阅读有关此功能的任何时候,它深入研究DNS记录和诸如此类的东西。我是一名应用程序开发人员...我不知道这些东西,我也不想让用户担心它。我错过了一些简单的事吗?

1 个答案:

答案 0 :(得分:15)

这不是一个典型的编程问题,但我认为这是测试基于Bonjour的代码的一个巨大障碍。

Bonjour支持两种服务器通知客户端存在的机制,首先是本地网络上的多播,第二种是DNS。

多播很容易使用,因为没有设置,不幸的是它只能在同一网络上使用。

DNS可以跨越路由器(Internet),但需要使用该名称服务器正确配置名称服务器和客户端。

我认为你只有两种选择。

  1. 在WiFi网络上宣传您的bonjour服务
  2. 配置您自己的DNS
  3. 在第一种情况下,重要的是要意识到该服务不一定必须由您在Mac上运行的应用程序进行广告宣传。您可以使用实用程序dns-sd将任何IP地址/端口注册为网络上的Bonjour服务。为此,您需要一台连接到WiFi的计算机(Mac,Linux),并以类似的方式运行dns-sd

    dns-sd -P "Stack Overflow" _http._tcp . 80 stackoverflow.com 69.59.196.211
    

    这将注册名为“Stack Overflow”的“http”服务作为Bonjour服务。检查出来 - 在终端中运行并在Bonjour下的Safari书签中查看。您可以像注册申请一样。

    不幸的是,您需要在连接到WiFi网络的计算机上运行此功能。这意味着您的Mac应用程序将在其自己的以太网网络上进行广告,dns-sd在WiFi上进行广告宣传。

    第二种选择有点令人恐惧,但如果你愿意接受一些管理,这并不是什么大问题。

    同样,您不需要在DNS中动态注册服务。您只需在DNS配置中硬编码Mac的名称和应用程序的端口即可。这些只需要添加到区域文件(DNS配置文件)中的4行。

    b._dns-sd._udp  IN PTR @   ;  b = browse domain
    lb._dns-sd._udp IN PTR @   ; lb = legacy browse domain
    _icool._tcp  PTR iCool\ App\ Service._http._tcp
    iCool\ App\ Service._http._tcp     SRV 0 0 8888 macpro.domain.com.
    

    前两行告诉客户端(在您的情况下是iOS设备),为此域启用了Bonjour。第三行告诉客户端,有一个类型为icool的服务“iCool App Service”可用。第四行告诉客户当前的服务地址和端口。

    客户端将为其配置(或通过DHCP获取)“搜索域”查找DNS条目。检查您的网络设置。

    您可以在Mac上运行名称服务器,某些Linux机器,也可以使用dyndns.com等服务。

    希望这有帮助。