title: Java DNSLookup get DNS attributes
body: <p>I'm quite new to the network DNS records and need a program that can run lookup to get 3 main DNS records of a domain (A,MX,NS).</p>
  
  <p>I have been looking for a java solution here an there and my final class is as below:
  However, I will always get a <strong>NameException</strong> and can't find the reason for it.</p>
  
  <p>[EDIT]: The problem seem to be with our internet, because using other wifi, the program run just fine.</p>
  
  <p>Many thanks,</p>
  
  <pre><code>import javax.naming.directory.Attributes;
  import javax.naming.directory.DirContext;
  import javax.naming.directory.InitialDirContext;
  import javax.naming.Context;
  import javax.naming.NamingEnumeration;
  import javax.naming.NamingException;
  import java.net.InetAddress;
  import java.net.UnknownHostException;
  import java.util.Hashtable;
  
  public class DNSLookup
  {
      public static void main(String args[])
      {
          String host = "google.com";
          try
          {
              InetAddress inetAddress = InetAddress.getByName(host);
              // show the Internet Address as name/address
              System.out.println(inetAddress.getHostName() + " " + inetAddress.getHostAddress());
  
              Hashtable&lt;String, String&gt; env = new Hashtable&lt;String, String&gt;();
              //env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
              //env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
  
              env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.dns.DnsContextFactory");
              //env.put(Context.PROVIDER_URL, "dns://google.com");
  
              // get the default initial Directory Context
              InitialDirContext iDirC = new InitialDirContext(env);
              // get the DNS records for inetAddress
              Attributes attributes = iDirC.getAttributes("dns:/"+inetAddress.getHostName());
              // get an enumeration of the attributes and print them out
              NamingEnumeration&lt;?&gt; attributeEnumeration = attributes.getAll();
              System.out.println("");
              while (attributeEnumeration.hasMore())
              {
                  System.out.println("" + attributeEnumeration.next());
              }
              attributeEnumeration.close();
          }
          catch (UnknownHostException exception)
          {
              System.err.println("ERROR: Cannot access '" + host + "'");
          }
          catch (NamingException exception)
          {
              System.err.println("ERROR: No DNS record for '" + host + "'");
              exception.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>google.com 74.125.128.113
  ERROR: No DNS record for 'google.com'
  javax.naming.CommunicationException: DNS error [Root exception is java.net.SocketTimeoutException: Receive timed out]; remaining name 'google.com'
      at com.sun.jndi.dns.DnsClient.query(Unknown Source)
      at com.sun.jndi.dns.Resolver.query(Unknown Source)
      at com.sun.jndi.dns.DnsContext.c_getAttributes(Unknown Source)
      at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(Unknown Source)
      at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(Unknown Source)
      at com.sun.jndi.toolkit.url.GenericURLDirContext.getAttributes(Unknown Source)
      at javax.naming.directory.InitialDirContext.getAttributes(Unknown Source)
      at javax.naming.directory.InitialDirContext.getAttributes(Unknown Source)
      at gimasys.dnsCrawler.DNSLookup.main(DNSLookup.java:35)
  Caused by: java.net.SocketTimeoutException: Receive timed out
      at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
      at java.net.DualStackPlainDatagramSocketImpl.receive0(Unknown Source)
      at java.net.AbstractPlainDatagramSocketImpl.receive(Unknown Source)
      at java.net.DatagramSocket.receive(Unknown Source)
      at com.sun.jndi.dns.DnsClient.doUdpQuery(Unknown Source)
      ... 9 more
  </code></pre>