InetAddress.getByName失败getaddrinfo工作

时间:2017-05-11 20:35:41

标签: java android c++ networking ipv6

我一直在查找IPv6地址的DNS查询问题,而我似乎无法找到有关的详细信息。

我正在尝试使用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服务器的记录"ipv4.local.com"指向{{1 }},以及指向192.168.0.190的记录"ipv6.local.com"

DNS服务器在Android设备的Wi-Fi设置中明确设置,并在3ffe:b00:0:1:4678:3eff:fe36:16e8上运行。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我不确定为什么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函数运行Java的过时版本    gethostbyname()(不支持IPv6)。一世   会建议您升级将使用 getaddrinfo()的Java。