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

标签 iphone cocoa networking bonjour dns-sd

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

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

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

最佳答案

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

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

多播很容易使用,因为无需设置,但遗憾的是它只能在同一网络上使用。

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

我认为你只有两个选择。

  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 等服务。

希望这有帮助。

关于iphone - 如何使用 Bonjour 跨子网宣传服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3752837/

相关文章:

iphone - 从 JSON 到 NSArray

cocoa - 在共享 CardDAV(10.6/服务器托管)地址簿中创建 ABPerson 记录

networking - 让 Laravel Homestead 可以通过互联网访问

unix - TCP 连接似乎接收到不完整的数据

android - 连接丢失时,异步任务下载器将失败

iphone - UIImage 未加载但文件存在

iphone - UITableView titleForSection 字体

ios - CocoaLumberjack iOS - 我们可以更改日志文件名称和目录吗?

swift - keyEquivalent 与 Swift 中的非字母数字字符

macos - NSURLConnection - 是否可以等待/阻止请求?