// Copyright (c) 2014 Tom Zhou<iwebpp@gmail.com> package com.iwebpp.node; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; public final class Dns extends EventEmitter2 { private static final String TAG = "Dns"; private static final Map<String, String> _errdesc; static { _errdesc = new Hashtable<String, String>(); _errdesc.put("NODATA", "DNS server returned answer with no data."); _errdesc.put("FORMERR", "DNS server claims query was misformatted."); _errdesc.put("SERVFAIL", "DNS server returned general failure."); _errdesc.put("NOTFOUND", "Domain name not found."); _errdesc.put("NOTIMP", "DNS server does not implement requested operation."); _errdesc.put("REFUSED", "DNS server refused query."); _errdesc.put("BADQUERY", "Misformatted DNS query."); _errdesc.put("BADNAME", "Misformatted domain name."); _errdesc.put("BADFAMILY", "Misformatted domain name."); _errdesc.put("BADRESP", "Misformatted DNS reply."); _errdesc.put("CONNREFUSED", "Could not contact DNS servers."); _errdesc.put("TIMEOUT", "Timeout while contacting DNS servers."); _errdesc.put("EOF", "End of file."); _errdesc.put("FILE", "Error reading file."); _errdesc.put("NOMEM", "Out of memory."); _errdesc.put("DESTRUCTION", "Channel is being destroyed."); _errdesc.put("BADSTR", "Misformatted string."); _errdesc.put("BADFLAGS", "Illegal flags specified."); _errdesc.put("NONAME", "Given hostname is not numeric."); _errdesc.put("BADHINTS", "Illegal hints flags specified."); _errdesc.put("NOTINITIALIZED", "c-ares library initialization not yet performed."); _errdesc.put("LOADIPHLPAPI", "Error loading iphlpapi.dll."); _errdesc.put("ADDRGETNETWORKPARAMS", "Could not find GetNetworkParams function."); _errdesc.put("CANCELLED", "DNS query cancelled."); } // return first matched IP public static String lookup(String domain) { try { InetAddress ipaddr = InetAddress.getByName(domain); String ip = ipaddr.getHostAddress(); debug(TAG, "domain:"+domain+",ip:"+ip); return ip; } catch (UnknownHostException e) { ///e.printStackTrace(); } return null; } public static String lookup(String domain, int family) { try { InetAddress[] ipaddrs = InetAddress.getAllByName(domain); String ip = null; // return first matched IP for (int i = 0; i < ipaddrs.length; i ++) { String addr = ipaddrs[i].getHostAddress(); if (family == 4 && Util.isIPv4(addr)) { ip = addr; break; } else if (family == 6 && Util.isIPv6(addr)) { ip = addr; break; } } debug(TAG, "domain:"+domain+",ip:"+ip); return ip; } catch (UnknownHostException e) { ///e.printStackTrace(); } return null; } public static void lookup(String domain, int family, lookupCallback callback) { } public interface lookupCallback { public void onLookup(NodeError err, String ip, int family) throws Exception; } public static List<String> reverse(String ip) { try { InetAddress[] ipaddrs = InetAddress.getAllByName(ip); List<String> domains = new ArrayList<String>(); for (int i = 0; i < ipaddrs.length; i ++) domains.add(ipaddrs[i].getHostName()); return domains; } catch (UnknownHostException e) { ///e.printStackTrace(); } return null; } public static void reverse(String ip, reverseCallback callback) { } public interface reverseCallback { public void onReverse(NodeError err, String [] domains) throws Exception; } }