Need to perform a reverse DNS lookup of a particular IP address in java

后端 未结 3 1596
生来不讨喜
生来不讨喜 2020-12-09 20:31

I need to get the DNS address, for example \"http://stackoverflow.com/questions/ask\". I used the following code and able to get in the form of 192.X.X.X.

相关标签:
3条回答
  • 2020-12-09 20:59

    I have taken the code linked to by @Sam DeHaan, cleaned it up a bit and tested it.

    /**
     * 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;
     }
    
    0 讨论(0)
  • 2020-12-09 21:09

    CodingForums similar question -- see post #5 (DISCLAIMER: Code is not mine, not tested by me)


    Code from linked source:

    /**
     * 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");
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-09 21:12
    InetAddress ia = InetAddress.getByAddress(new byte[] {74,125,127,106});
    // or 
    ia = InetAddress.getByName("74.125.127.106");
    System.out.println(ia.getCanonicalHostName());
    
    0 讨论(0)
提交回复
热议问题