2013-11-21 6 views
0

В одном из моих приложений для Android я использую поддержку JmDNS для Bonjour. При запуске я создаю один экземпляр JmDNS для каждого InetAddress в NetworkInterface. Таким образом, код выглядит примерно так:Какой IPv6-адрес я должен использовать для Bonjour?

for(InetAddress addr : addresses) { 
    JmDNS jmdns = JmDNS.create(addr, "SomeName"); 
} 

Это до сих пор работал хорошо, и делая это как для v4 и v6 адреса, я могу просмотреть все правильно от других клиентов (например, на IOS).

Однако, с IPv6, один сетевой адаптер может быть связан с несколькими адресами v6. Так, например, один из моих бета-тестеров отправил мне «отчет об ошибке» со следующей настройкой сети (я изменил некоторые цифры, чтобы предотвратить утечку информации - надеюсь, что это не изменит смысл):

- ip: /fe80::b4a:8eff:fe91:b1bb%mlan0 
isLoopBack: false 
isLinkLocal: true 
isAnyLocal: false 
isSiteLocal: false 

- ip: /1234:d000:1234:d1:b4a:8eff:fe91:b1bb 
isLoopBack: false 
isLinkLocal: false 
isAnyLocal: false 
isSiteLocal: false 

- ip: /10.0.1.5 
isLoopBack: false 
isLinkLocal: false 
isAnyLocal: false 
isSiteLocal: true 

Глядя на этот вывод, кажется, что два адреса IPv6 на самом деле очень похожи, возможно, один из них является локальным, а другой - нет. Чтение article on Wikipedia, я смог получить это в IPv6, все интерфейсы на самом деле должны иметь локальный адрес ссылки.

Тем не менее, я в тупике о том, какой из двух людей действительно используется для регистрации JmDNS. Если зарегистрировать обоих, я получаю постоянный поток из бревен, которые говорят:

Got противоречивого зонд из себя входящих: [х @ 123456789 Тип: индекс TYPE_SRV 33, класс: индекс CLASS_IN 1, имя: something._tcp .местный. ttl: '3599/3600' сервер: 'SomeName.local.:5000']

Какой из них я должен использовать? И существует ли общее правило для определения адресов из группы для регистрации?

ответ

1

Ответ в этих четырех битах.

Loopback не подходит для Bonjour, поэтому устраните петлю. Для Bonjour вам нужен локальный адрес, потому что Bonjour является локальным по своей природе, но если есть более одного ethernet, вы, вероятно, хотите все. Поэтому я предлагаю, чтобы, если есть местный адрес, вы принимаете это, в противном случае принимаете адрес ссылки. Вероятно, здесь есть ссылка.

Когда вы получаете адрес, обратите внимание на его preferred_lft (то есть его время жизни для новых подключений, также существует более длинный valid_lft для существующих подключений) и настройте таймер для повторной регистрации после этого периода.

+0

Итак, если я правильно понимаю, вы говорите, что в этом случае я должен зарегистрировать 1-й и 3-й адреса и игнорировать 2-й. Это верно? – yydl

+0

@yydl Так как вы все равно разговариваете с устройствами на основе ссылок, то да, вам нужно будет только использовать или использовать локальные адреса IPv6. –