Code:import java.io.*; import java.net.*; import java.util.*; public class JavaDNS { private final int TIMEOUT = 5000; boolean isRunning = true; DatagramSocket socket = null; MonitorThread monitorThread = null; long startTime = 0; long enquiryCount = 0; int downCount = 0; boolean silentMode = false; HashMap <String, String> lookupHash = new HashMap<String, String>(); public static void main(String [] argc) { boolean silent = false; if (argc.length == 1 && argc[0].equals("silent")); silent = true; JavaDNS dns = new JavaDNS(silent); dns.start(); } public JavaDNS(boolean silentMode) { startTime = System.currentTimeMillis(); buildHash(); } private void buildHash() { log("Build HashMap"); int seg1, seg2, seg3, seg4; for (int i=1; i<=1000000; i++) { seg1 = 1; seg2 = (int) (i / 65535); seg3 = (int) (i / 255); seg4 = i % 255; lookupHash.put(i + "abc.pepddns.com", seg1 + "." + seg2 + "." + seg3 + "." + seg4); if (i % 10000 == 0) { log(i + " records hashed"); } } } public void stop() { isRunning = false; try { if (socket != null && socket.isConnected()) { socket.close(); } } catch (Exception e) { } } private void bindSocket() throws SocketException { try { byte [] baddr = {0x0000, 0x0000, 0x0000, 0x0000}; InetAddress addr = InetAddress.getByAddress(baddr); socket = new DatagramSocket(53, addr); log("-- Bind socket on port 53"); } catch (Exception e) { e.printStackTrace(); throw new SocketException(e.getMessage()); } } public void start() { try { if (monitorThread == null || !monitorThread.isAlive() || !monitorThread.isRunning()) { monitorThread = null; monitorThread = new MonitorThread(); monitorThread.start(); } if (socket == null) { bindSocket(); } byte[] buf = new byte[512]; while (isRunning) { DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); ProcessThread processThread = new ProcessThread(socket, packet); processThread.start(); enquiryCount++; } } catch (Exception e) { e.printStackTrace(); downCount++; if (isRunning) { start(); } } } private class MonitorThread extends Thread { private boolean running = true; public MonitorThread() { } public void run() { try { while (running) { if (!silentMode) { log("Health Check " + new java.util.Date()); log("-- Enquiry Count: " + enquiryCount); log("-- Processing Thread: " + Thread.currentThread().getThreadGroup().activeCount()); log("-- Up Time: " + ((System.currentTimeMillis() - startTime) / 1000) + " seconds"); log("-- Down Count: " + downCount); } Thread.sleep(60000); } } catch (Exception e){ running = false; } } public boolean isRunning() { return running; } } private class ProcessThread extends Thread { DatagramSocket socket; DatagramPacket packet; public ProcessThread(DatagramSocket socket, DatagramPacket packet) { this.socket = socket; this.packet = packet; } public void run() { try { int offset = 12; // Ignore first 12 bytes StringBuffer sb = new StringBuffer(); byte[] queryData = packet.getData(); int len = (int) queryData[offset]; while (len > 0) { if (sb.length() > 0) { sb.append("."); } sb.append(new String(queryData, offset+1, len)); offset += len + 1; len = queryData[offset]; } offset = packet.getLength(); //log("Receive Query from " + packet.getAddress() + " for : " + sb.toString()); queryData[2] = (byte) 0x0081; // Response Flag #1 queryData[3] = (byte) 0x0080; // Response Flag #2 queryData[7] = (byte) 0x0001; // It's a response queryData[offset++] = (byte) 0x00c0; // Name is a pointer queryData[offset++] = (byte) 0x000c; // Pointer is to the name at offset 0x000c queryData[offset++] = (byte) 0x0000; queryData[offset++] = (byte) 0x0001; // Answer is a type A query queryData[offset++] = (byte) 0x0000; queryData[offset++] = (byte) 0x0001; // Answer is clas IN queryData[offset++] = (byte) 0x0000; queryData[offset++] = (byte) 0x0000; queryData[offset++] = (byte) 0x0002; // Response is valid for 0x0258 (600 sec) queryData[offset++] = (byte) 0x0058; queryData[offset++] = (byte) 0x0000; queryData[offset++] = (byte) 0x0004; // Address is 4 bytes long // Return IP on below String ip = lookupHash.get(sb.toString()); if (ip == null) ip = "1.2.3.4"; String [] ipSec = ip.split("[.]"); queryData[offset++] = (byte) Integer.parseInt(ipSec[0]); // Ip Sec 1 queryData[offset++] = (byte) Integer.parseInt(ipSec[1]); // Ip Sec 2 queryData[offset++] = (byte) Integer.parseInt(ipSec[2]); // Ip Sec 3 queryData[offset++] = (byte) Integer.parseInt(ipSec[3]); // Ip Sec 4 packet.setData(queryData, 0, offset); socket.send(packet); } catch (Exception e) { e.printStackTrace(); } } } private void log(String msg) { if (!silentMode) System.out.println(msg); } }
Regards,
Man Pak Hong, Dave
[email protected]