--- old/test/jdk/com/sun/jndi/dns/lib/DNSTracer.java 2018-07-12 14:53:12.000000000 +0800 +++ new/test/jdk/com/sun/jndi/dns/lib/DNSTracer.java 2018-07-12 14:53:12.000000000 +0800 @@ -26,6 +26,7 @@ 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; @@ -46,7 +47,7 @@ * * 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(); @@ -56,28 +57,30 @@ 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()); @@ -116,7 +119,7 @@ resPacket.getLength(), reqPacket.getSocketAddress())); } } catch (SocketException se) { - if (inSocket.isClosed()) { + if (!isRunning) { out.flush(); System.out.println("DNSTracer: Exit"); } else { @@ -127,4 +130,22 @@ } } + @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; + } + } }