--- a/test/jdk/com/sun/jndi/dns/lib/DNSTracer.java Tue Jul 24 08:58:32 2018 -0700
+++ b/test/jdk/com/sun/jndi/dns/lib/DNSTracer.java Wed Jul 25 11:03:07 2018 +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;
+ }
+ }
}