3

次のコードを使用して、IPアドレスのDNS名を返す単純なJavaプログラムを作成しようとしています:

InetAddress host = InetAddress.getByName(ip);
String dnsName = host.getHostName();

dns 名が登録されている場合、getHostName() はこの名前を返し、存在しない dns 名がない場合は、IP アドレスが返されます。

多くのアドレスでは、nslookup コマンドが戻る間、上記のコードは何も返しません。

たとえば、アドレス 82.117.193.169 の場合、nslookup はpeer-AS31042.sbb.rsを返しますが、getHostName() はアドレスのみを返します。これはすべてのアドレスで発生するわけではありませんが、多くの場合に発生します。

4

2 に答える 2

1

オンデマンドで利用できる場合でも、デフォルトでは DNS を使用するようにコンピューターが構成されていない場合があります。

私は試してみます

ping 82.117.193.169

IP アドレスがホスト名に解決されるかどうかを確認します。

于 2012-09-03T18:14:34.263 に答える
1

これは、「A」レコード チェックが原因です。Java は、検索している IP 番号がそこにリストされていることを望んでいます。彼らはそれを「XXX」と呼んでいますが、私はその理由を理解しています:

private static String getHostFromNameService(InetAddress addr, boolean check) {
String host = null;
for (NameService nameService : nameServices) {
    try {
        // first lookup the hostname
        host = nameService.getHostByAddr(addr.getAddress());

        /* check to see if calling code is allowed to know
         * the hostname for this IP address, ie, connect to the host
         */
        if (check) {
            SecurityManager sec = System.getSecurityManager();
            if (sec != null) {
                sec.checkConnect(host, -1);
            }
        }

        /* now get all the IP addresses for this hostname,
         * and make sure one of them matches the original IP
         * address. We do this to try and prevent spoofing.
         */

        InetAddress[] arr = InetAddress.getAllByName0(host, check);
        boolean ok = false;

        if(arr != null) {
            for(int i = 0; !ok && i < arr.length; i++) {
                ok = addr.equals(arr[i]);
            }
        }

        //XXX: if it looks a spoof just return the address?
        if (!ok) {
            host = addr.getHostAddress();
            return host;
        }

        break;
于 2017-04-04T03:57:35.487 に答える