< 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 >