InetAddress.getByName 失败 getaddrinfo 工作

InetAddress.getByName fails getaddrinfo works

本文关键字:工作 getaddrinfo 失败 getByName InetAddress      更新时间:2023-10-16

我在DNS查找IPv6地址时遇到了问题,我似乎找不到关于它的好信息。

我正在尝试使用InetAddress.getByName("ipv6.local.com")查找 IPv6 地址。 它会引发UnknownHostException错误。

奇怪的部分是我知道可以联系DNS服务器,因为这有效:

InetAddress.getByName("ipv4.local.com")

我也知道 IPv6 记录正在工作,因为我可以运行:

nslookup ipv6.local.com

并且它正确地返回3ffe:b00:0:1:4678:3eff:fe36:16e8.

同样,如果我在C++中运行以下内容,我也得到上述地址的结果:

int errorCode = getaddrinfo("ipv6.local.com", "4242", &hints, &res);

我也试过Inet6Address.getByName(),但这也抛出了UnknownHostException. 那么为什么getaddrinfo()nslookup工作而不是InetAddress.getByName()呢?

我正在尝试从与DNS服务器在同一网络上运行Android 6.0.1的Android设备(Galaxy Tab S2 8")进行DNS查找。 DNS 服务器有一个指向192.168.0.190的记录"ipv4.local.com",以及一个指向3ffe:b00:0:1:4678:3eff:fe36:16e8的记录"ipv6.local.com"

DNS 服务器在 Android 设备上的 Wi-Fi 设置中显式设置,并在192.168.0.182上运行。

有什么想法吗?

我不确定为什么IPv6分辨率不适合您。这是我测试的Java代码(java版本"1.8.0_171")的示例:

package com.myjava.ip;

import java.net.InetAddress;
import java.net.UnknownHostException;
class MyIpByHost {
public static void main(String a[]){
try {
InetAddress host = InetAddress.getByName("ipv6.google.com");
System.out.println(host.getHostAddress());
} catch (UnknownHostException ex) {
ex.printStackTrace();
}
}
}

输出: java com/myjava/ip/MyIpByHost => 2404:6800:4003:c02:0:0:0:8a

此代码返回终结点"ipv6.google.com"的 IPv6。

Java在其后端运行C函数以完成工作。如你所知,C 的 getaddrinfo() 函数支持 IPv6,但 gethostbyname() 不支持。 您可能正在运行带有底层 C 函数的过时版本的 Javagethostbyname()不支持 IPv6。我 建议你升级使用getaddrinfo()的Java。