9

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

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

这可能吗?我知道 Bonjour 应该支持跨子网的通信,但每当我尝试阅读此功能时,它都会深入研究 DNS 记录等。我是一名应用程序开发人员......我不知道这些东西,我也不希望用户担心它。我错过了一些简单的东西吗?

4

1 回答 1

15

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

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

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

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

我认为你只有两个选择。

  1. 在 WiFi 网络上宣传您的 Bonjour 服务
  2. 配置自己的 DNS

在第一种情况下,重要的是要意识到服务不一定必须由您自己在 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 这样的服务。

希望这可以帮助。

于 2010-09-23T21:18:50.540 回答