IP アドレスに複数のホスト名をマップできるという要件があります。調べてみましInetAddress.getAllByName("10.33.28.55")
たが、目的の結果が得られず、エントリが 1 つしか返されませんでした。nslookup
は、すべての DNS エントリを返します。Java でこの IP アドレスに関連付けられたすべてのホスト名を取得するにはどうすればよいですか?
3 に答える
ソースコードを見ると、提供されたものが IP アドレスのテキスト表現であるInetAddress.getAllByName()
場合、実際には DNS クエリを実行しないことがわかります。String
IP を含む単一のInetAdddress
オブジェクトを含む配列を返すだけです。彼らはメソッドに便利なコメントを入れさえしました:
// 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 アドレスが指定された場合、アドレス形式の有効性のみがチェックされます」と記載されています。... 私はそれが検索されないことをあなたに伝えていないと主張します.
しかし、それについて考えてみると...それは、クラスがIPアドレスをカプセル化するという文脈で理にかなっていInetAddress
ます...あなたは1つしか持っていません。それは本当に必要getHostNames()
でありgetAllCanonicalNames()
、あなたが求めていることを行う(複数に注意してください)方法です。問題を開く/パッチを提出することを考えています。
とはいえ、現在、複数の PTR レコードがサポートされている RDNS クエリを実行する組み込みの方法はないようです。他のすべてのルックアップ メソッドは、返された最初のレコードを削除するだけで、それが得られます。
Java用のサードパーティの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));
}
}
}
}
良い方法は 1 つだけです。Java プロセスから nslookup や dig などを呼び出します。
Runtime.getRuntime().exec(..) を使用
またはProcessBuilderでより良い...