summaryrefslogtreecommitdiffstats
path: root/libtorrent/src/policy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libtorrent/src/policy.cpp')
-rwxr-xr-xlibtorrent/src/policy.cpp35
1 files changed, 30 insertions, 5 deletions
diff --git a/libtorrent/src/policy.cpp b/libtorrent/src/policy.cpp
index 0599096d5..4f3f8cfa4 100755
--- a/libtorrent/src/policy.cpp
+++ b/libtorrent/src/policy.cpp
@@ -525,7 +525,18 @@ namespace libtorrent
int max_failcount = m_torrent->settings().max_failcount;
int min_reconnect_time = m_torrent->settings().min_reconnect_time;
+ int min_cidr_distance = (std::numeric_limits<int>::max)();
bool finished = m_torrent->is_finished();
+ address external_ip = m_torrent->session().m_external_address;
+
+ if (external_ip == address())
+ {
+ // set external_ip to a random value, to
+ // radomize which peers we prefer
+ address_v4::bytes_type bytes;
+ std::generate(bytes.begin(), bytes.end(), &std::rand);
+ external_ip = address_v4(bytes);
+ }
aux::session_impl& ses = m_torrent->session();
@@ -549,15 +560,29 @@ namespace libtorrent
TORRENT_ASSERT(i->second.connected <= now);
- if (i->second.connected <= min_connect_time)
- {
- min_connect_time = i->second.connected;
- candidate = i;
- }
+ if (i->second.connected > min_connect_time) continue;
+ int distance = cidr_distance(external_ip, i->second.ip.address());
+ if (distance > min_cidr_distance) continue;
+
+ min_cidr_distance = distance;
+ min_connect_time = i->second.connected;
+ candidate = i;
}
TORRENT_ASSERT(min_connect_time <= now);
+#if defined TORRENT_LOGGING || defined TORRENT_VERBOSE_LOGGING
+ if (candidate != m_peers.end())
+ {
+ (*m_torrent->session().m_logger) << "*** FOUND CONNECTION CANDIDATE ["
+ " ip: " << candidate->second.ip <<
+ " d: " << min_cidr_distance <<
+ " external: " << external_ip <<
+ " t: " << total_seconds(time_now() - min_connect_time) <<
+ " ]\n";
+ }
+#endif
+
return candidate;
}
/*