< prev index next >

test/jdk/com/sun/jndi/dns/lib/DNSTracer.java

Print this page

        

@@ -24,10 +24,11 @@
 import sun.security.util.HexDumpEncoder;
 
 import java.io.PrintStream;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.net.SocketException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;

@@ -44,42 +45,44 @@
  *
  * xxxx: 00 11 22 33 44 55 66 77   88 99 aa bb cc dd ee ff  ................
  *
  * Typically, the capture file data will be used by DNSServer for playback
  */
-public class DNSTracer implements Runnable {
+public class DNSTracer extends Thread implements Server {
     public static final int DNS_DEFAULT_PORT = 53;
     public static final int DNS_PACKET_SIZE = 512;
     static HexDumpEncoder encoder = new HexDumpEncoder();
 
     private DatagramSocket inSocket;
     private SocketAddress dnsServerAddress;
     private ByteBuffer reqBuffer = ByteBuffer.allocate(DNS_PACKET_SIZE);
     private ByteBuffer resBuffer = ByteBuffer.allocate(DNS_PACKET_SIZE);
     private PrintStream out = null;
+    private volatile boolean isRunning;
 
-    public DNSTracer(DatagramSocket socket, String dnsHostname) {
-        this(socket, dnsHostname, DNS_DEFAULT_PORT);
+    public DNSTracer(String dnsHostname) throws SocketException {
+        this(dnsHostname, DNS_DEFAULT_PORT);
     }
 
-    public DNSTracer(DatagramSocket socket, PrintStream outStream,
-            String dnsHostname) {
-        this(socket, outStream, dnsHostname, DNS_DEFAULT_PORT);
+    public DNSTracer(PrintStream outStream, String dnsHostname)
+            throws SocketException {
+        this(outStream, dnsHostname, DNS_DEFAULT_PORT);
     }
 
-    public DNSTracer(DatagramSocket socket, String dnsHostname, int dnsPort) {
-        this(socket, System.out, dnsHostname, dnsPort);
+    public DNSTracer(String dnsHostname, int dnsPort) throws SocketException {
+        this(System.out, dnsHostname, dnsPort);
     }
 
-    public DNSTracer(DatagramSocket socket, PrintStream outStream,
-            String dnsHostname, int dnsPort) {
-        inSocket = socket;
+    public DNSTracer(PrintStream outStream, String dnsHostname, int dnsPort)
+            throws SocketException {
+        inSocket = new DatagramSocket(0, InetAddress.getLoopbackAddress());
         out = outStream;
         dnsServerAddress = new InetSocketAddress(dnsHostname, dnsPort);
     }
 
     public void run() {
+        isRunning = true;
         System.out.println(
                 "DNSTracer: listening on port " + inSocket.getLocalPort());
 
         System.out.println("DNSTracer: will forward request to server "
                 + dnsServerAddress);

@@ -114,17 +117,35 @@
 
                 inSocket.send(new DatagramPacket(resPacket.getData(),
                         resPacket.getLength(), reqPacket.getSocketAddress()));
             }
         } catch (SocketException se) {
-            if (inSocket.isClosed()) {
+            if (!isRunning) {
                 out.flush();
                 System.out.println("DNSTracer: Exit");
             } else {
                 se.printStackTrace();
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
+    @Override public void stopServer() {
+        isRunning = false;
+        if (inSocket != null) {
+            try {
+                inSocket.close();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Override public int getPort() {
+        if (inSocket != null) {
+            return inSocket.getLocalPort();
+        } else {
+            return -1;
+        }
+    }
 }
< prev index next >