4

我有两台 iOS 设备使用 Bonjour API 成功地找到彼此,但由于它们同时发布和浏览,它们也看到自己出现在可用服务列表中。每个端点必须有一些信息可以用来确定服务是他们自己的,并将其从他们的列表中排除...我确定我只是在某个地方错过了它 - 有什么想法吗?

我使用了文档中的示例,并进行了一些小改动。

4

3 回答 3

4

mDNS 不区分设备边界——链路本地网络上的每个 mDNS 解析器都会侦听默认情况下发送到的所有224.0.0.251多播数据包,无论来源如何。把它想象成一个美化的短波收音机。嗯,有点。

这意味着当您浏览服务时,NSNetServiceBrowser 不会区分主机(有时我发现它在服务器端应用程序中是一个有用的功能)。

我建议忽略您自己的服务的最简单方法是检查回调中返回hostname的对象是否不是您的,然后再做任何您需要做的事情。NSNetServicenetServiceBrowser:didFindService:moreComing:

于 2011-10-19T17:09:12.517 回答
0

我正在使用 IOS 8.1,我也有同样的问题。我最终将 didFindService 返回的每个服务的名称与代表我的 bonjour 服务器的本地 NSNetService 的名称进行了比较。

根据我在调试我的应用程序时看到的情况,每个 NSNetService 的主机名都是 nil,直到服务被解析。在我的情况下,我没有在 didFindService 中调用 resolveWithTimeout,因为我想显示数据需要很长时间。

于 2014-11-24T06:16:01.323 回答
0

正如接受的答案所暗示的,将NSNetService名称与设备名称进行比较:

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
    // Ignore the local device if specified
    if ([aNetService.name isEqualToString:UIDevice.currentDevice.name])
    {
        NSLog(@"NETSERVICE: Ignoring NetService for self: '%@'", aNetService.name); 
    }
    else
    {
        ...
    }

    // If that's it then stop the browser (it's manually controlled)
    if (!moreComing) {
        [_netBrowser stop];
    }
}
于 2015-07-20T21:11:30.690 回答