我正在实施一个iPhone / iPad应用程序,允许用户使用bonjour协议发送彼此的消息。基本上,服务器通过bonjour发布他的服务,连接到同一wifi的客户端可以发现他的服务并连接到它以开始发送消息。我发现的问题是有些路由器似乎与Bonjour有问题。在家里或其他地方运行我的应用程序时,它运行得很好。出版和发现的bonjour服务完美无瑕。然而,当我在我朋友的一间公寓试用我的应用程序时,一些(并非所有)客户都无法发现已发布的bonjour服务。我还注意到其他使用Bonjour的应用程序(例如Apple的远程应用程序)在所述网络上也遇到了麻烦。在做了一些挖掘后,我发现其他人在使用bonjour和一些路由器方面遇到了类似的问题。因此,我有两个问题:
1)有没有人知道一些路由器似乎有Bonjour的这个问题是一个普遍的问题?换句话说,如果我的应用程序依赖于Bonjour才能运行,我是否必须担心它不会在50%的WLAN网络中运行,或者大多数路由器都没有任何bonjour问题。显然,我不能指望任何人知道每个路由器如何处理bonjour数据包,但也许有一些网络大师可以指出我正确的方向:-p。
2)其次,如果bonjour对于构建我的应用程序的协议风险太大,有哪些替代方案具有类似功能?我(最好)需要的功能是服务发布和发现,用户无需手动输入其他手机的IP地址。
好的谢谢你的帮助!我知道这是一个广泛的问题,但任何帮助表示赞赏! :)
答案 0 :(得分:3)
这可能是一个难以破解的难题。导致设备在某些网络上无法找到彼此的问题与底层传输(即多播UDP)有关,而与Bonjour(或mDNS或其他任何你想称之为的网络)无关。
在高级,非严格的条件下,组播数据会给路由器带来更多负载。大型企业和大学网络有时会丢弃Bonjour消息(即发送到端口224.0.0.251
上的多播组5353
的UDP数据包),因为这意味着网络没有被成千上万的客户广告他们的iTunes库所淹没或者其他什么,并且在规模上这可以改善一般性能。另一方面,由于制造商只知道的原因,一些国内路由器将多播数据包从开箱即用中丢弃。对于这两种情况,你都无法做很多事情。
尝试在网络上运行tcpdump
以查看数据包是否实际通过。我没有遇到过一段时间没有转发它们的家用路由器。如果他们不是,你将不得不提出一些中心[面向互联网,也许?]查找工具。如果它们可见,那么您的实施就会出现问题。
没有什么可以阻止你编写自己的简单协议来通过多播发送服务发现 - 只是已经编写和测试了大量不同语言的大量Bonjour客户端。