2011-08-17 52 views
8

我需要獲取DNS地址,例如「http://stackoverflow.com/questions/ask」。我使用了下面的代碼,並能夠以192.X.X.X的形式獲得。需要對java中的特定IP地址執行反向DNS查找

Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); 
    DirContext ictx = new InitialDirContext(env); 
    String dnsServers = (String) ictx.getEnvironment().get("java.naming.provider.url"); 

    System.out.println("DNS Servers: " + dnsServers); 
+0

這是什麼問題?它工作還是它給你一個錯誤?錯誤是什麼? – unholysampler

+0

@ unholysampler:我需要用word.like www.google.com來獲取DNS地址。該代碼以子網的形式給出。 – Manikandan

回答

7

CodingForums similar question - 看帖子#5(免責聲明:代碼是不是我的,不是我測試)


從鏈接源代碼:

/** 
* 25 Nov 2009 REVERSE DNS LOOKUP USING JNDI 
* In this example the IP being looked up is 211.21.152.4 
* The octets are reversed (4.152.21.211) 
* and appended to the in-addr.arpa zone: 
* 4.152.21.211.in-addr.arpa 
*/ 

import javax.naming.*; 
import javax.naming.directory.*; 
import java.util.*; 

public class dns { 
    public static void main(String[] args) { 
     try { 
      Hashtable env = new Hashtable(); 
      env.put("java.naming.factory.initial","com.sun.jndi.dns.DnsContextFactory"); 

      DirContext ctx = new InitialDirContext(env); 
      Attributes attrs = ctx.getAttributes("4.152.21.211.in-addr.arpa",new String[] {"PTR"}); 

      for (NamingEnumeration ae = attrs.getAll();ae.hasMoreElements();) { 
       Attribute attr = (Attribute)ae.next(); 
       String attrId = attr.getID(); 
       for (Enumeration vals = attr.getAll();vals.hasMoreElements(); 
       System.out.println(attrId + ": " + vals.nextElement())); 
      } 

      ctx.close(); 
     } 

     catch(Exception e) { 
      System.out.println("NO REVERSE DNS"); 
     } 
    } 
} 
+1

謝謝。最佳答案,因爲你可以將自己的dns定義爲:env.put(Context.PROVIDER_URL,「dns://」+ DNS_SERVER_IP)和許多其他初始上下文選項。 – dalvarezmartinez1

13
InetAddress ia = InetAddress.getByAddress(new byte[] {74,125,127,106}); 
// or 
ia = InetAddress.getByName("74.125.127.106"); 
System.out.println(ia.getCanonicalHostName()); 
+0

我給字節[]中的216,239,51,99。它要求我爲前兩個字節輸入字節(216和239)。我鍵入種姓。它只打印216.239.51.99而不是文字。 – Manikandan

+1

@Jack如果你有linux/mac盒子並且使用dig -x 216.239.51.99你會看到沒有答案的那個數字。這意味着它沒有DNS的入口。這就是爲什麼你拿回號碼作爲迴應。 – Clint

7

我已採取由@Sam DeHaan鏈接的代碼,清理了一下並測試了它。

/** 
* Do a reverse DNS lookup to find the host name associated with an IP address. Gets results more often than 
* {@link java.net.InetAddress#getCanonicalHostName()}, but also tries the Inet implementation if reverse DNS does 
* not work. 
* 
* Based on code found at http://www.codingforums.com/showpost.php?p=892349&postcount=5 
* 
* @param ip The IP address to look up 
* @return The host name, if one could be found, or the IP address 
*/ 
private static String getHostName(final String ip) 
{ 
    String retVal = null; 
    final String[] bytes = ip.split("\\."); 
    if (bytes.length == 4) 
    { 
     try 
     { 
     final java.util.Hashtable<String, String> env = new java.util.Hashtable<String, String>(); 
     env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); 
     final javax.naming.directory.DirContext ctx = new javax.naming.directory.InitialDirContext(env); 
     final String reverseDnsDomain = bytes[3] + "." + bytes[2] + "." + bytes[1] + "." + bytes[0] + ".in-addr.arpa"; 
     final javax.naming.directory.Attributes attrs = ctx.getAttributes(reverseDnsDomain, new String[] 
     { 
      "PTR", 
     }); 
     for (final javax.naming.NamingEnumeration<? extends javax.naming.directory.Attribute> ae = attrs.getAll(); ae.hasMoreElements();) 
     { 
      final javax.naming.directory.Attribute attr = ae.next(); 
      final String attrId = attr.getID(); 
      for (final java.util.Enumeration<?> vals = attr.getAll(); vals.hasMoreElements();) 
      { 
       String value = vals.nextElement().toString(); 
       // System.out.println(attrId + ": " + value); 

       if ("PTR".equals(attrId)) 
       { 
        final int len = value.length(); 
        if (value.charAt(len - 1) == '.') 
        { 
        // Strip out trailing period 
        value = value.substring(0, len - 1); 
        } 
        retVal = value; 
       } 
      } 
     } 
     ctx.close(); 
     } 
     catch (final javax.naming.NamingException e) 
     { 
     // No reverse DNS that we could find, try with InetAddress 
     System.out.print(""); // NO-OP 
     } 
    } 

    if (null == retVal) 
    { 
     try 
     { 
     retVal = java.net.InetAddress.getByName(ip).getCanonicalHostName(); 
     } 
     catch (final java.net.UnknownHostException e1) 
     { 
     retVal = ip; 
     } 
    } 

    return retVal; 
} 
+1

需要注意的是,並不總是可以進行反向查找,因爲數據並不總是存在於DNS中。 –