下面列出了怎么用org.xbill.DNS.SimpleResolver的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Constructor
*
* @param timeoutInSeconds the timeout for queries in seconds, 0 means infinite
* @param nLog optional Log instance for logging
*/
public DNS (int timeoutInSeconds, Log nLog) {
log = nLog;
if (timeoutInSeconds > 0) {
try {
resolv = new SimpleResolver ();
resolv.setTimeout (timeoutInSeconds);
} catch (UnknownHostException e) {
if (log != null) {
log.out (Log.WARNING, "dns", "Failed to find proper DNS host: " + e.toString ());
}
resolv = null;
}
} else {
resolv = null;
}
}
@Override
protected List<String> fetch() {
try {
Resolver resolver = new SimpleResolver();
// dns resolvers may take a long time to return a response.
resolver.setTimeout(timeout);
Lookup l =
new Lookup(StringUtils.endsWith(hostname, ".") ? hostname : hostname + ".", Type.TXT);
// always make sure the cache is empty
l.setCache(new Cache());
l.setResolver(resolver);
Record[] records = l.run();
if (records != null && records.length > 0) {
return parse(records[0]);
}
} catch (Exception e) {
log.error("Problem while adding Google resolvers, continue without", e);
}
log.error("No Google resolver addresses found");
return Collections.emptyList();
}
private void init() {
if (mInitialized) return; else mInitialized = true;
try {
// configure the resolvers, starting with the default ones (based on the current network connection)
Resolver defaultResolver = Lookup.getDefaultResolver();
// use Google's public DNS services
Resolver googleFirstResolver = new SimpleResolver("8.8.8.8");
Resolver googleSecondResolver = new SimpleResolver("8.8.4.4");
// also try using Amazon
Resolver amazonResolver = new SimpleResolver("205.251.198.30");
Lookup.setDefaultResolver(new ExtendedResolver(new Resolver[]{
googleFirstResolver, googleSecondResolver, amazonResolver, defaultResolver }));
} catch (UnknownHostException e) {
Log.w(TAG, "Couldn't initialize custom resolvers");
}
}
private void initializeApi26Nameservers() throws InitializationException {
if (context == null) {
throw new InitializationException("Context must be initialized by calling setContext");
}
ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
Network network = cm.getActiveNetwork();
if (network == null) {
// if the device is offline, there's no active network
return;
}
LinkProperties lp = cm.getLinkProperties(network);
if (lp == null) {
// can be null for an unknown network, which may happen if networks change
return;
}
for (InetAddress address : lp.getDnsServers()) {
addNameserver(new InetSocketAddress(address, SimpleResolver.DEFAULT_PORT));
}
parseSearchPathList(lp.getDomains(), ",");
}
public static String reverseDNSLookup(final InetAddress adr)
{
try
{
final Name name = ReverseMap.fromAddress(adr);
final Lookup lookup = new Lookup(name, Type.PTR);
lookup.setResolver(new SimpleResolver());
lookup.setCache(null);
final Record[] records = lookup.run();
if (lookup.getResult() == Lookup.SUCCESSFUL)
for (final Record record : records)
if (record instanceof PTRRecord)
{
final PTRRecord ptr = (PTRRecord) record;
return ptr.getTarget().toString();
}
}
catch (final Exception e)
{
}
return null;
}
public static String resolve(String host, int addrType) {
try {
Lookup lookup = new Lookup(host, addrType);
SimpleResolver resolver = new SimpleResolver("114.114.114.114");
resolver.setTimeout(5);
lookup.setResolver(resolver);
Record[] result = lookup.run();
if (result == null || result.length == 0) {
return null;
}
List<Record> records = new ArrayList<>(Arrays.asList(result));
Collections.shuffle(records);
for (Record r : records) {
switch (addrType) {
case Type.A:
return ((ARecord) r).getAddress().getHostAddress();
case Type.AAAA:
return ((AAAARecord) r).getAddress().getHostAddress();
default:
break;
}
}
} catch (Exception e) {
VayLog.e(TAG, "resolve", e);
app.track(e);
}
return null;
}
public static String resolve(String host, int addrType) {
try {
Lookup lookup = new Lookup(host, addrType);
SimpleResolver resolver = new SimpleResolver("114.114.114.114");
resolver.setTimeout(5);
lookup.setResolver(resolver);
Record[] result = lookup.run();
if (result == null || result.length == 0) {
return null;
}
List<Record> records = new ArrayList<>(Arrays.asList(result));
Collections.shuffle(records);
for (Record r : records) {
switch (addrType) {
case Type.A:
return ((ARecord) r).getAddress().getHostAddress();
case Type.AAAA:
return ((AAAARecord) r).getAddress().getHostAddress();
default:
break;
}
}
} catch (Exception e) {
VayLog.e(TAG, "resolve", e);
ShadowsocksApplication.app.track(e);
}
return null;
}
public GcpIpRanges() {
try {
this.resolver = new SimpleResolver("8.8.8.8");
} catch (UnknownHostException uex) {
log.error("cannot instantiate resolver", uex);
}
}
@Override
protected Boolean doInBackground(String... args) {
//main();
if (args.length != 1) return false;
String name = args[0];
if ((name == null) || (name.isEmpty()))
return false; //pointless trying to lookup nothing
Timber.d("Resolving %s", name);
try {
SimpleResolver sr = new SimpleResolver(DNSSEC_SERVERS[new Random().nextInt(DNSSEC_SERVERS.length)]);
ValidatingResolver vr = new ValidatingResolver(sr);
vr.setTimeout(0, DNS_LOOKUP_TIMEOUT);
vr.loadTrustAnchors(new ByteArrayInputStream(ROOT.getBytes("ASCII")));
Record qr = Record.newRecord(Name.fromConstantString(name + "."), Type.TXT, DClass.IN);
Message response = vr.send(Message.newQuery(qr));
final int rcode = response.getRcode();
if (rcode != Rcode.NOERROR) {
Timber.i("Rcode: %s", Rcode.string(rcode));
for (RRset set : response.getSectionRRsets(Section.ADDITIONAL)) {
if (set.getName().equals(Name.root) && set.getType() == Type.TXT
&& set.getDClass() == ValidatingResolver.VALIDATION_REASON_QCLASS) {
Timber.i("Reason: %s", ((TXTRecord) set.first()).getStrings().get(0));
}
}
return false;
} else {
dnssec = response.getHeader().getFlag(Flags.AD);
for (Record record : response.getSectionArray(Section.ANSWER)) {
if (record.getType() == Type.TXT) {
txts.addAll(((TXTRecord) record).getStrings());
}
}
}
} catch (IOException | IllegalArgumentException ex) {
return false;
}
return true;
}
@Test
public void shouldReturnResultsUsingSpecifiedServers() throws Exception {
final String server = new SimpleResolver().getAddress().getHostName();
final DnsSrvResolver resolver = DnsSrvResolvers
.newBuilder()
.servers(List.of(server))
.build();
assertThat(resolver.resolve("_spotify-client._tcp.spotify.com").isEmpty(), is(false));
}
/**
* Initializes the servers, search path and ndots setting with from the property names passed as
* the arguments.
*
* @param serverName the property name for the DNS servers
* @param searchName the property name for the search path
* @param ndotsName the property name for the ndots setting
* @since 3.2
*/
protected void initialize(String serverName, String searchName, String ndotsName) {
String servers = System.getProperty(serverName);
if (servers != null) {
StringTokenizer st = new StringTokenizer(servers, ",");
while (st.hasMoreTokens()) {
String server = st.nextToken();
try {
URI uri = new URI("dns://" + server);
// assume this is an IPv6 address without brackets
if (uri.getHost() == null) {
addNameserver(new InetSocketAddress(server, SimpleResolver.DEFAULT_PORT));
} else {
int port = uri.getPort();
if (port == -1) {
port = SimpleResolver.DEFAULT_PORT;
}
addNameserver(new InetSocketAddress(uri.getHost(), port));
}
} catch (URISyntaxException e) {
log.warn("Ignored invalid server {}", server);
}
}
}
String searchPathProperty = System.getProperty(searchName);
parseSearchPathList(searchPathProperty, ",");
String ndotsProperty = System.getProperty(ndotsName);
ndots = parseNdots(ndotsProperty);
}
private void initializeNameservers() {
for (int i = 1; i <= 4; i++) {
String server = SystemProperties.get("net.dns" + i);
if (server != null && !server.isEmpty()) {
addNameserver(new InetSocketAddress(server, SimpleResolver.DEFAULT_PORT));
}
}
}
public static Long getASN(final InetAddress adr)
{
try
{
final Name postfix;
if (adr instanceof Inet6Address)
postfix = Name.fromConstantString("origin6.asn.cymru.com");
else
postfix = Name.fromConstantString("origin.asn.cymru.com");
final Name name = getReverseIPName(adr, postfix);
System.out.println("lookup: " + name);
final Lookup lookup = new Lookup(name, Type.TXT);
lookup.setResolver(new SimpleResolver());
lookup.setCache(null);
final Record[] records = lookup.run();
if (lookup.getResult() == Lookup.SUCCESSFUL)
for (final Record record : records)
if (record instanceof TXTRecord)
{
final TXTRecord txt = (TXTRecord) record;
@SuppressWarnings("unchecked")
final List<String> strings = txt.getStrings();
if (strings != null && !strings.isEmpty())
{
final String result = strings.get(0);
final String[] parts = result.split(" ?\\| ?");
if (parts != null && parts.length >= 1)
return new Long(parts[0]);
}
}
}
catch (final Exception e)
{
}
return null;
}
public static String getASName(final long asn)
{
try
{
final Name postfix = Name.fromConstantString("asn.cymru.com.");
final Name name = new Name(String.format("AS%d", asn), postfix);
System.out.println("lookup: " + name);
final Lookup lookup = new Lookup(name, Type.TXT);
lookup.setResolver(new SimpleResolver());
lookup.setCache(null);
final Record[] records = lookup.run();
if (lookup.getResult() == Lookup.SUCCESSFUL)
for (final Record record : records)
if (record instanceof TXTRecord)
{
final TXTRecord txt = (TXTRecord) record;
@SuppressWarnings("unchecked")
final List<String> strings = txt.getStrings();
if (strings != null && !strings.isEmpty())
{
System.out.println(strings);
final String result = strings.get(0);
final String[] parts = result.split(" ?\\| ?");
if (parts != null && parts.length >= 1)
return parts[4];
}
}
}
catch (final Exception e)
{
}
return null;
}
public static String getAScountry(final long asn)
{
try
{
final Name postfix = Name.fromConstantString("asn.cymru.com.");
final Name name = new Name(String.format("AS%d", asn), postfix);
System.out.println("lookup: " + name);
final Lookup lookup = new Lookup(name, Type.TXT);
lookup.setResolver(new SimpleResolver());
lookup.setCache(null);
final Record[] records = lookup.run();
if (lookup.getResult() == Lookup.SUCCESSFUL)
for (final Record record : records)
if (record instanceof TXTRecord)
{
final TXTRecord txt = (TXTRecord) record;
@SuppressWarnings("unchecked")
final List<String> strings = txt.getStrings();
if (strings != null && !strings.isEmpty())
{
final String result = strings.get(0);
final String[] parts = result.split(" ?\\| ?");
if (parts != null && parts.length >= 1)
return parts[1];
}
}
}
catch (final Exception e)
{
}
return null;
}