12

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.

 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 ); 
2
  • What is the question? Did it work or did it give you an error? What was the error? Commented Aug 17, 2011 at 18:30
  • @ unholysampler : I need to get the dns address in words..like www.google.com. This code gives in the form of subnet. Commented Aug 17, 2011 at 18:32

3 Answers 3

19
InetAddress ia = InetAddress.getByAddress(new byte[] {74,125,127,106}); // or ia = InetAddress.getByName("74.125.127.106"); System.out.println(ia.getCanonicalHostName()); 
Sign up to request clarification or add additional context in comments.

2 Comments

I give 216,239,51,99 in the byte[]. It asked me to type caste to byte for the first two(216 and 239). I type caste it. It prints 216.239.51.99 only not in words.
@Jack if you have linux/mac box and use dig -x 216.239.51.99 you will see that there is no answer for that number. That means there is no entry in DNS for it. That is why you get the number back in response.
9

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

7 Comments

It's important to note that it isn't always possible to do a reverse lookup because the data isn't always there in DNS.
Why don't we try getCanonicalHostName first and use DirContext as fallback? Is it because getCanonicalHostName may return wrong result?
I'm asking because ctx.getAttributes is usually slow
@basin Two reasons: 1. On my machine, getCanonicalHostName was very unreliable, so trying it before DirContext was often a waste of time. 2. It fails silently. If it cannot resolve an IP address, it does not return an error but returns the IP as the hostname. Detecting a failure would involve running all returns through an IP address regex.
This code has some odd things in it. My main issue with this is that attrId == "PTR" is checkd inside the nested loop but is set in the outside loop. There is no need to interate over attr.getAll() if attrId is not PTR Also, once retVal is set, we dont break/return. So essentially this code returns the last value found in the nested loop in the last PTR attribute
|
8

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

2 Comments

Thanks. Best answer since you can define your own dns as: env.put(Context.PROVIDER_URL, "dns://" + DNS_SERVER_IP) and many other options for the initial context.
What about ipv6?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.