Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 针对无法解析的IP地址,在Windows块上重新进行dns查找几秒钟_Java_Windows_Dns_Network Programming_Ip - Fatal编程技术网

Java 针对无法解析的IP地址,在Windows块上重新进行dns查找几秒钟

Java 针对无法解析的IP地址,在Windows块上重新进行dns查找几秒钟,java,windows,dns,network-programming,ip,Java,Windows,Dns,Network Programming,Ip,我正在使用Java的InetAddress.getHostName()执行一些反向DNS查找,所用的时间似乎有问题。下面是一段代码片段: public static void main(String[] args) throws IOException { byte[][] addresses = new byte[][] { { 10, (byte) 0, (byte) 0, (byte) 138 } , new byte[] { (byte) 216, (byte) 239, (b

我正在使用Java的
InetAddress.getHostName()
执行一些反向DNS查找,所用的时间似乎有问题。下面是一段代码片段:

public static void main(String[] args) throws IOException {

byte[][] addresses = new byte[][] { { 10, (byte) 0, (byte) 0, (byte) 138 }
    , new byte[] { (byte) 216, (byte) 239, (byte) 49, (byte) 245 }
    ,{ 8, (byte) 8, (byte) 8, (byte) 8 } };

    for (byte[] addr : addresses) {
        InetAddress inet = InetAddress.getByAddress(addr);
        long before = System.currentTimeMillis();
        String hostName = inet.getHostName();
        System.out.printf("%20s %40s %5d\n", inet.getHostAddress(), hostName, (System.currentTimeMillis() - before));
    }
}
这是我机器上的输出:

    10.0.0.138                               10.0.0.138  4503
216.239.49.245                           216.239.49.245  4591
       8.8.8.8           google-public-dns-a.google.com     8
解析10.0.0.138和216.239.49.245都需要4.5秒,无论我运行了多少次此代码。这似乎发生在所有无法解析的IP地址上

这不是一个网络问题,因为根据wireshark捕获,当运行此代码时,DNS查询甚至不会发送,除非首先清除DNS缓存(然后结果更慢-大约每分辨率4.7秒)

那么,针对操作系统的本地DNS缓存,Java实际上需要4.5秒才能超时吗?这毫无意义。命令行实用程序
nslookup
返回这些IP地址的结果(无法解析)的速度要快得多,而且它甚至不使用缓存

有人能解释一下这种行为,并提出加快解决这些问题的方法吗?在不使用外部库的情况下,我唯一能想到的就是使用多个线程,这样至少可以并行执行4.5秒的超时

作为参考,我在Windows7x64上使用JDK7U71

Edit1: 这个问题似乎是相关的,但答案是性能取决于网络,这不是我观察到的

Edit2:

这似乎是windows的问题。同一LAN中使用完全相同DNS、运行OpenSuse 13.1和JDK 1.7u67的机器返回以下结果:

没有DNS缓存:

10.0.0.138                                   10.0.0.138  116             
216.239.49.245                           216.239.49.245  5098             
8.8.8.8                  google-public-dns-a.google.com  301
10.0.0.138                                   10.0.0.138  5
216.239.49.245                           216.239.49.245  9             
8.8.8.8                  google-public-dns-a.google.com  40
使用DNS缓存:

10.0.0.138                                   10.0.0.138  116             
216.239.49.245                           216.239.49.245  5098             
8.8.8.8                  google-public-dns-a.google.com  301
10.0.0.138                                   10.0.0.138  5
216.239.49.245                           216.239.49.245  9             
8.8.8.8                  google-public-dns-a.google.com  40
Edit3:


最终,我不得不通过使用自己的反向DNS查找来解决这个问题

在Windows中实施DNS客户端时似乎出现了问题。我刚刚在C#NET中尝试了同样的逻辑:

结果如下:

   10.0.0.138 N/A 00:00:04.5604560
   216.239.49.245 N/A 00:00:04.7984798
   8.8.8.8 google-public-dns-a.google.com 00:00:00.0060006

有趣的是,在DNS缓存刷新之后,Windows会将所有DNS请求发送到网络。DNS服务器在0.25秒后回复,但如果回答是“没有这样的名称”,DNS客户端仍会在整个超时期间阻塞。

这将是您的DNS,而不是Java。使用
nslookup
工具进行调查。@EJP这不是我的DNS,原因有两个-1)没有DNS查找(使用wireshark检查)。从操作系统的缓存中获取结果需要4.5秒2)可解析IP的延迟是几毫秒,因为它们确实来自DNS,而不可解析IP的结果总是精确地需要4.5秒,这暗示了某个超时值。Windows团队没有对此进行修复吗?“我可能记错了。”@Davio我不记得任何类似的事情(不过,这个问题对我来说是新的)。而且,我在谷歌上找不到任何东西。你能回忆起任何细节吗?我想是Java中有一个很老的DNS错误,但可能是别的什么?见鬼,可能是铬!也许就是这样D