diff --git a/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java b/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java index b30ddb83a..4b4ff9222 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java @@ -19,6 +19,8 @@ package org.bitcoinj.net.discovery; import org.bitcoinj.core.*; import org.bitcoinj.utils.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.*; import java.util.*; @@ -36,6 +38,8 @@ import java.util.concurrent.*; * to connect to, you need to discover them via other means (like addr broadcasts).

*/ public class DnsDiscovery extends MultiplexingDiscovery { + private static final Logger log = LoggerFactory.getLogger(DnsDiscovery.class); + /** * Supports finding peers through DNS A records. Community run DNS entry points will be used. * @@ -85,17 +89,32 @@ public class DnsDiscovery extends MultiplexingDiscovery { @Override public List getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException { - if (services != 0) - throw new PeerDiscoveryException("DNS seeds cannot filter by services: " + services); - try { - InetAddress[] response = InetAddress.getAllByName(hostname); - List result = new ArrayList<>(response.length); - for (InetAddress r : response) - result.add(new InetSocketAddress(r, params.getPort())); - return result; - } catch (UnknownHostException e) { - throw new PeerDiscoveryException(e); + InetAddress[] response = null; + if (services != 0) { + String hostnameWithServices = "x" + Long.toHexString(services) + "." + hostname; + log.info("Requesting {} peers from {}", VersionMessage.toStringServices(services), + hostnameWithServices); + try { + response = InetAddress.getAllByName(hostnameWithServices); + log.info("Got {} peers from {}", response.length, hostnameWithServices); + } catch (UnknownHostException e) { + log.info("Seed {} doesn't appear to support service bit filtering: {}", hostname, e.getMessage()); + } } + if (response == null || response.length == 0) { + log.info("Requesting all peers from {}", hostname); + try { + response = InetAddress.getAllByName(hostname); + log.info("Got {} peers from {}", response.length, hostname); + } catch (UnknownHostException e) { + throw new PeerDiscoveryException(e); + } + } + + List result = new ArrayList<>(response.length); + for (InetAddress r : response) + result.add(new InetSocketAddress(r, params.getPort())); + return result; } @Override diff --git a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java index 7ecdb3bfb..d6e09b3ce 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java @@ -76,13 +76,10 @@ public class MultiplexingDiscovery implements PeerDiscovery { for (HttpDiscovery.Details httpSeed : httpSeeds) discoveries.add(new HttpDiscovery(params, httpSeed, httpClient)); } - // Also use DNS seeds if there is no specific service requirement - if (services == 0) { - String[] dnsSeeds = params.getDnsSeeds(); - if (dnsSeeds != null) - for (String dnsSeed : dnsSeeds) - discoveries.add(new DnsSeedDiscovery(params, dnsSeed)); - } + String[] dnsSeeds = params.getDnsSeeds(); + if (dnsSeeds != null) + for (String dnsSeed : dnsSeeds) + discoveries.add(new DnsSeedDiscovery(params, dnsSeed)); return new MultiplexingDiscovery(params, discoveries, parallelQueries, shufflePeers); }