Apple Bonjour: как узнать, какая опубликованная служба принадлежит мне?

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

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


person iforce2d    schedule 11.10.2011    source источник


Ответы (3)


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

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

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

person Chris Mowforth    schedule 19.10.2011
comment
Спасибо, Крис. Я поставлю этому зеленую галочку, потому что кажется, что это лучшее, что можно сделать. Я думал об этом раньше, но надеялся, что есть более точный способ, чем проверка текстовых имен, которые могут быть одинаковыми на разных устройствах. - person iforce2d; 10.11.2011
comment
Вместо этого вы можете установить уникальный идентификатор в TXT сервиса, чтобы узнавать себя. См. stackoverflow.com/a/15835190/161972 для UUID. - person huyz; 10.07.2014
comment
@huyz да, так и будет - person Chris Mowforth; 19.06.2017

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

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

person costa    schedule 24.11.2014

Как намекает принятый ответ, сравните имя 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];
    }
}
person Hari Honor    schedule 20.07.2015
comment
Как упоминалось в моем комментарии к принятому ответу, это не работает, если два устройства имеют одинаковое имя. - person iforce2d; 21.07.2015
comment
Кроме того, я обнаружил, что UIDevice.currentDevice.name не всегда совпадает с сетевым именем устройства! Я не уверен, как напрямую получить сетевое имя устройства bonjour, но в моем случае я использую сетевой MIDI, поэтому вместо проверки выше я сравниваю [aNetService.name isEqualToString:[MIDINetworkSession defaultSession].networkName] - person Chadwick Wood; 07.08.2015
comment
Я использую эту технику точно так же, как это в течение многих лет. Но так как мы знаем, что вы делаете это для MIDI, обратите внимание, что MIDINetworkSession имеет networkName, который вы должны использовать, может быть? сейчас попробую - person Dan Rosenstark; 29.10.2016
comment
Извините: я уже сделал это, и я также сверяюсь с currentDevice.name. Это работает довольно хорошо... если что-то из этого правда, то это мы сами. Теперь... если бы я мог на самом деле контролировать, какое имя на самом деле используется MIDINetworkSession.defaultSession, я был бы счастлив. О, Чедвик уже все это сказал. Во всяком случае, двигаться вперед... - person Dan Rosenstark; 29.10.2016