Как определить IPv6-адрес (по имени) хоста в моей локальной сети - PullRequest
2 голосов
/ 04 ноября 2011

У меня есть два компьютера, подключенных к одному маршрутизатору сети, который, как я знаю, поддерживает IPv6.Давайте назовем их «PC-A» и «PC-B

». Я хочу, чтобы «PC-A» выяснил IPv6-адрес «PC-B» и наоборот

ПервоеЯ делаю это

setSystem.setProperty("java.net.preferIPv6Addresses", "true");

Если я тогда скажу

InetAddress IPAddress = InetAddress.getLocalHost();

, я могу получить свой собственный адрес в формате IpV6

Однако ни один из следующих двухоператор дает мне IPv6-адрес "PC-B":

Inet6Address IPAddress6 = (Inet6Address)InetAddress.getByName("PC-B");
InetAddress IPAddress = InetAddress.getByName("PC-B");

Я также пытался импортировать

import com.lavantech.net.dns.SimpleDNSLookup;
import com.lavantech.net.dns.DNSLookup

Первый, который я использую как:

SimpleDNSLookup d = new SimpleDNSLookup();
System.out.println(d.getInet6Address("PC-B"));

и второй как:

DNSLookup dnsLookup = new DNSLookup("PC-B", DNSLookup.QTYPE_AAAA, DNSLookup.QCLASS_IN, 3000, null);
// Get all Address Records.
ResourceRecord[] ansRecords = dnsLookup.getAAAARecords();
System.out.println(ansRecords[0]);

ни один из которых не работает.

Я также попытался использовать следующее

import org.xbill.DNS.*;

int type = Type.AAAA;
Name name = Name.fromString("PC-B");
Lookup lookup = new Lookup(name, type);
lookup.run();
int result = lookup.getResult();
Record[] answers = lookup.getAnswers();
System.out.println(answers[0]); 
// (where, for brevity, i am skipping the parts where I check whether result == Lookup.SUCCESSFUL
  • Обратите внимание, что еслиЯ заменяю «PC-B» на, скажем, «ipv6.google.com», я получаю все желаемые результаты!
  • Также обратите внимание, что если я просто использую InetAddress и Type_A, где это применимо в вышеуказанных подходах, моя программабез проблем возвращает IPv4-адрес "PC-B".

Чего мне не хватает? Любая помощь очень ценится!

1 Ответ

0 голосов
/ 24 февраля 2012

Ваш вопрос - к сожалению, - еще не решенная проблема сети, связанная с обнаружением хоста в локальной подсети (независимо от того, есть ли в этой подсети маршрутизатор или нет).

Ваш желаемый вывод - это адрес IPv6, но неясно, что именно вы вводите.

Давайте сосредоточимся на ПК-Б. Как именно вы идентифицируете PC-B? Ясно, что вы называете это «PC-B», но это имя должно быть где-то настроено, прежде чем ваш ПК узнает, что это его имя. Где именно это настроено? Это имя хоста, которое вы установили на самом ПК-B, или есть сервер доменных имен (DNS), где вы дали это имя? Если это имя в системе DNS, вы действительно можете запросить в системе DNS запись AAAA для получения адреса IPv6, но вам нужно полное доменное имя (FQDN). Например. "PC-B.yourdomain.com", а не просто "PC-B".

Если вам известен MAC-адрес PC-B, вы можете использовать протокол обнаружения соседей (NDP), чтобы узнать IP-адрес PC-B.

Существуют сетевые протоколы, которые позволяют ПК-А и ПК-В самим объявлять свои имена после их настройки на локальных машинах. Такие протоколы называются протоколами «обнаружения служб», и ваши варианты здесь (1) многоадресная DNS (mDNS) и, возможно, обнаружение службы DNS (DNS-SD) поверх этого; или (2) Простой протокол обнаружения услуг (SSDP) в UPnP, с другой стороны. Преимущество состоит в том, что некоторые операционные системы уже реализуют это. Например. если PC-B является хостом Mac OS X, все, что вам нужно сделать, это запросить у DNS запрос «pc-b.local», чтобы получить ответ. К сожалению, хотя реализации mDNS существуют для Linux (Avahi) и Windows (Bonjour), по умолчанию они не установлены. Третий вариант - написать собственный протокол обнаружения хоста и заставить ваши хосты запускать этот протокол.

Следует учитывать, какие платформы вы хотите поддерживать, если установка стороннего программного обеспечения является опцией, если обнаружение должно быть безопасным (вышеупомянутые параметры - нет, посмотрите на Обнаружение безопасного соседа -SEND-, если это вызывает озабоченность) и какой ввод у вас в первую очередь (имя хоста "PC-B" или тип сервиса, который работает на PC-B, например, _http._tcp для веб-сервера).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...