| // Copyright (c) 2005 Brian Wellington (bwelling@xbill.org) |
| |
| package org.xbill.DNS; |
| |
| import java.io.*; |
| import java.net.*; |
| import java.nio.channels.*; |
| import org.xbill.DNS.utils.hexdump; |
| |
| class Client { |
| |
| protected long endTime; |
| protected SelectionKey key; |
| |
| protected |
| Client(SelectableChannel channel, long endTime) throws IOException { |
| boolean done = false; |
| Selector selector = null; |
| this.endTime = endTime; |
| try { |
| selector = Selector.open(); |
| channel.configureBlocking(false); |
| key = channel.register(selector, SelectionKey.OP_READ); |
| done = true; |
| } |
| finally { |
| if (!done && selector != null) |
| selector.close(); |
| if (!done) |
| channel.close(); |
| } |
| } |
| |
| static protected void |
| blockUntil(SelectionKey key, long endTime) throws IOException { |
| long timeout = endTime - System.currentTimeMillis(); |
| int nkeys = 0; |
| if (timeout > 0) |
| nkeys = key.selector().select(timeout); |
| else if (timeout == 0) |
| nkeys = key.selector().selectNow(); |
| if (nkeys == 0) |
| throw new SocketTimeoutException(); |
| } |
| |
| static protected void |
| verboseLog(String prefix, byte [] data) { |
| if (Options.check("verbosemsg")) |
| System.err.println(hexdump.dump(prefix, data)); |
| } |
| |
| void |
| cleanup() throws IOException { |
| key.selector().close(); |
| key.channel().close(); |
| } |
| |
| } |