gpt4 book ai didi

java - 获取网络中某个 IP 地址的所有主机名

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:09 24 4
gpt4 key购买 nike

我有一个要求,其中一个 IP 地址可以映射多个主机名。我试着查看 InetAddress.getAllByName("10.33.28.55") 但是我没有得到想要的结果,它只返回一个条目。 IP 地址上的 nslookup 返回所有 DNS 条目。我如何在 Java 中检索与此 IP 地址关联的所有主机名?

最佳答案

查看 InetAddress.getAllByName() 的源代码,您会发现如果提供的 String 是 IP 的文本表示,它实际上不会执行 DNS 查询地址。它只是返回一个数组,其中包含一个包含 IP 的 InetAddress 对象。他们甚至在方法中添加了一个方便的注释:

// if host is an IP address, we won't do further lookup

(参见:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java.net/InetAddress.java.html)

要是 JavaDoc 这么清楚就好了。它声明 “如果提供了文字 IP 地址,则仅检查地址格式的有效性。” ...我认为这并没有告诉您它不会被查看向上。

然而,考虑一下......它在 InetAddress 的上下文中是有意义的 - 该类封装了一个 IP 地址......你只有一个。它确实需要 getHostNames()getAllCanonicalNames() (注意复数)方法来满足您的要求。我正在考虑打开一个问题/提交一个补丁。

也就是说,目前似乎没有内置的方法来执行支持多个 PTR 记录的 RDNS 查询。所有其他查找方法只是简单地删除返回的第一条记录,这就是你得到的。

您将不得不研究用于 java 的第 3 方 DNS 库(抱歉,我没有使用它们的经验)。

编辑补充:我喜欢把事情弄清楚。我手边没有具有多个 PTR 记录的 IP 来对此进行测试,但它应该可以解决问题。

import java.io.IOException;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;

public class App
{
public static void main(String[] args) throws IOException, NamingException
{
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
InitialDirContext idc = new InitialDirContext(env);

String ipAddr = "74.125.225.196";

// Turn the IP into an in-addr.arpa name
// 196.225.125.74.in-addr.arpa.
String[] quads = ipAddr.split("\\.");
StringBuilder sb = new StringBuilder();
for (int i = quads.length - 1; i >= 0; i--)
{
sb.append(quads[i]).append(".");
}
sb.append("in-addr.arpa.");
ipAddr = sb.toString();

Attributes attrs = idc.getAttributes(ipAddr, new String[] {"PTR"});
Attribute attr = attrs.get("PTR");

if (attr != null)
{
for (int i = 0; i < attr.size(); i++)
{
System.out.println((String)attr.get(i));
}
}
}
}

关于java - 获取网络中某个 IP 地址的所有主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16615121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com