【问题标题】:How to figure out an IPv6 address (by name) of a host in my LAN如何找出局域网中主机的 IPv6 地址(按名称)
【发布时间】:2011-11-04 06:37:01
【问题描述】:

我有两台计算机插入我知道支持 IPv6 的网络的同一路由器。我们称它们为“PC-A”和“PC-B”

我希望“PC-A”找出“PC-B”的 IPv6 地址,反之亦然

我做的第一件事是

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

如果我说

InetAddress IPAddress = InetAddress.getLocalHost();

我可以得到自己的地址,该地址将采用 IpV6 格式

但是,以下两个语句都没有给出“PC-B”的 IPv6 地址:

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,我的程序将毫无问题地返回“PC-B”的 IPv4 地址。

我错过了什么? 非常感谢任何帮助!

【问题讨论】:

  • 我不相信你能在你的网络上对本地计算机进行 DNS 查找,除非你有一个运行着记录 PC-A 和 PC-B 的 DNS 服务器

标签: java ipv6


【解决方案1】:

您的问题是 - 不幸的是 - 一个尚未解决的网络问题,处理本地子网上的主机发现(无论该子网是否有路由器)。

您想要的输出显然是一个 IPv6 地址,但不清楚您的输入到底是什么。

让我们专注于 PC-B。您如何准确识别 PC-B?很明显,您将其称为“PC-B”,但该名称应该在您的 PC 知道它的名称之前在某处配置。究竟是在哪里配置的?是您在 PC-B 本身上设置的主机名,还是您在其中提供了该名称的域名服务器 (DNS)?如果是DNS系统中的名称,确实可以向DNS系统查询AAAA记录得到IPv6地址,但需要全限定域名(FQDN)。例如。 “PC-B.yourdomain.com”,而不仅仅是“PC-B”。

如果知道 PC-B 的 MAC 地址,就可以使用邻居发现协议 (NDP) 找出 PC-B 的 IP 地址。

一旦您在本地计算机上配置了 PC-A 和 PC-B,就有一些网络协议允许它们自己宣布它们的名称。此类协议称为“服务发现”协议,您可以在此处选择 (1) 多播 DNS (mDNS) 以及可能的 DNS 服务发现 (DNS-SD);或者 (2) 另一方面,UPnP 中的简单服务发现协议 (SSDP)。优点是一些操作系统已经实现了这一点。例如。如果 PC-B 是 Mac OS X 主机,您只需在 DNS 中查询“pc-b.local”即可获得答案。不幸的是,虽然 Linux (Avahi) 和 Windows (Bonjour) 存在 mDNS 实现,但默认情况下并未安装它们。第三种选择是编写您自己的主机发现协议,并让您的主机运行该协议。

注意事项是您要支持哪些平台,是否可以选择安装第三方软件,是否需要安全发现(上述选项不是,请查看 Secure Neighbor Discovery -SEND- 如果这是一个问题) ,以及您首先输入的内容(主机名“PC-B”,或在 PC-B 上运行的服务类型,例如 _http._tcp 用于网络服务器)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2011-08-24
    • 2014-08-25
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多