Apple Bonjour: как узнать, какой опубликованный сервис принадлежит мне? - PullRequest
4 голосов
/ 11 октября 2011

У меня есть два устройства iOS, которые успешно находят друг друга с помощью API Bonjour, но, поскольку они одновременно публикуют и просматривают, они также видят себя в списке доступных сервисов.Должно быть какое-то количество информации, которую каждая конечная точка может использовать, чтобы определить, что сервис является их собственным, и исключить его из своего списка ... Я уверен, что просто где-то пропустил - какие-нибудь идеи?

Я использовал примеры из документов с небольшими изменениями.

Ответы [ 3 ]

4 голосов
/ 19 октября 2011

mDNS не делает различий между границами устройства - каждый распознаватель mDNS в локальной сети связи прослушивает все многоадресные пакеты, отправляемые на 224.0.0.251 по умолчанию независимо от источника.Думайте об этом как о прославленном коротковолновом радио.Ну, вроде.

Это означает, что когда вы просматриваете сервисы, NSNetServiceBrowser не делает различий между хостами (и иногда я обнаружил, что это полезная функция в серверных приложениях).

Я бы предложил самый простой способ игнорировать ваши собственные службы, это проверить, что hostname объекта NSNetService, возвращенного в обратном вызове netServiceBrowser:didFindService:moreComing:, не ваш, прежде чем делать то, что вам нужно сделать сэто.

0 голосов
/ 21 июля 2015

Как видно из принятого ответа, сравните имя 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];
    }
}
0 голосов
/ 24 ноября 2014

Я использую IOS 8.1, и у меня возник тот же вопрос. Я закончил тем, что сравнил имя каждой службы, возвращаемой didFindService, с именем локальной NSNetService, представляющей мой добрый сервер.

Исходя из того, что я вижу при отладке моего приложения, имя хоста каждого NSNetService равно нулю, пока служба не будет разрешена. В моем случае я не вызывал resolWithTimeout внутри didFindService, потому что я полагаю, что для отображения данных потребуется слишком много времени.

...