需要在java中执行特定IP地址的反向DNS查找

时间:2011-08-17 18:26:55

标签: java dns

我需要获取DNS地址,例如“http://stackoverflow.com/questions/ask”。我使用以下代码并能够以192.X.X.X的形式获得。

  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 ); 

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:8)

我已经将@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;
 }

答案 2 :(得分: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");
        }
    }
}