java

2011-08-17 7 views
8

'de belirli bir IP adresinin ters DNS araması yapması gerekiyor. DNS adresini almam gerekiyor, örneğin "http://stackoverflow.com/questions/ask". Aşağıdaki kodu kullandım ve 192.X.X.X biçiminde alabiliyorum.java

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

Soru nedir? İşe ya da sana bir hata mı verdi? Hata neydi? – unholysampler

+0

@ unholysampler: dns adresini kelimelerle almalıyım… www.google.com gibi. Bu kod, alt ağ biçiminde verilir. – Manikandan

cevap

7

CodingForums similar question - sonrası 5. (ÖNEMLİ AÇIKLAMA: Kod değil bana göre test edilmemiş benimdir,) bakın:

/** 
* 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

Teşekkürler. En iyi cevap kendi dns'inizi tanımlayabileceğinizden beri: env.put (Context.PROVIDER_URL, "dns: //" + DNS_SERVER_IP) ve ilk içerik için diğer birçok seçenek. – 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

Bayt [] 'da 216,239,51,99 veriyorum. İlk iki (216 ve 239) için kasten byte yazmamı istedi. Ben kast ediyorum. Sadece kelimelerle değil 216.239.51.99 basar. – Manikandan

+1

@ Eğer linux/mac kutunuz varsa ve dig -x 216.239.51.99 kullanınsa bu numara için bir cevap olmadığını göreceksiniz. Bunun anlamı, DNS'de bunun için bir giriş olmamasıdır. Bu yüzden numarayı cevap olarak aldınız. – Clint

7

ben bağlantılı bir kaynaktan


Kodu @Sam DeHaan tarafından bağlanan kodu aldık, biraz temizledim ve test ettik.

/** 
* 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

Geriye doğru arama yapmak her zaman mümkün olmadığından, verilerin her zaman DNS'de bulunmadığından emin olmak önemlidir. –