From 0d96e094104b61493e15c94d849155d2624df19f Mon Sep 17 00:00:00 2001 From: Magnus Jonsson Date: Wed, 14 Jan 2004 16:18:53 +0000 Subject: [PATCH] Remember old peers and connect to them --- include/libtorrent/policy.hpp | 14 +++++--- src/policy.cpp | 65 ++++++++++++++++++++++++++++++----- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/include/libtorrent/policy.hpp b/include/libtorrent/policy.hpp index 8093837b2..41f52751e 100755 --- a/include/libtorrent/policy.hpp +++ b/include/libtorrent/policy.hpp @@ -59,14 +59,14 @@ namespace libtorrent // for peer choking management void pulse(); - // called when an incoming connection is accepted - // return false if the connection closed - void new_connection(peer_connection& c); - // this is called once for every peer we get from // the tracker void peer_from_tracker(const address& remote, const peer_id& id); + // called when an incoming connection is accepted + // return false if the connection closed + void new_connection(peer_connection& c); + // the given connection was just closed void connection_closed(const peer_connection& c); @@ -158,6 +158,10 @@ namespace libtorrent peer* find_unchoke_candidate(); + bool connect_one_peer(); + peer* find_connect_candidate(); + + // a functor that identifies peers that have disconnected and that // are too old for still being saved. @@ -168,7 +172,7 @@ namespace libtorrent using namespace boost::posix_time; return p.connection == 0 - && second_clock::local_time() - p.connected > seconds(5*60); + && second_clock::local_time() - p.connected > seconds(30*60); } }; diff --git a/src/policy.cpp b/src/policy.cpp index c523e55b0..ea73f560a 100755 --- a/src/policy.cpp +++ b/src/policy.cpp @@ -354,16 +354,48 @@ namespace libtorrent return unchoke_peer; } + policy::peer *policy::find_connect_candidate() + { + boost::posix_time::ptime local_time=boost::posix_time::second_clock::local_time(); + boost::posix_time::ptime ptime(local_time); + policy::peer *candidate=0; + + for (std::vector::iterator i = m_peers.begin(); + i != m_peers.end(); + ++i) + { + if(i->connection) continue; + if(i->banned) continue; + + assert(i->connected <= local_time); + + boost::posix_time::ptime next_connect=i->connected + boost::posix_time::seconds(2*60); + + if (next_connect <= ptime) + { + ptime=next_connect; + candidate=&*i; + } + } + + assert(ptime <= local_time); + + return candidate; + } + void policy::pulse() { using namespace boost::posix_time; - // remove old disconnected peers from the list +/* // remove old disconnected peers from the list m_peers.erase( std::remove_if(m_peers.begin() , m_peers.end() , old_disconnected_peer()) , m_peers.end()); +*/ + //while(connect_one_peer()); + connect_one_peer(); // if the share ratio is 0 (infinite) @@ -484,6 +516,8 @@ namespace libtorrent // we don't have ny info about this peer. // add a new entry + + peer p(c.get_peer_id(), c.get_socket()->sender()); m_peers.push_back(p); i = m_peers.end()-1; @@ -494,8 +528,8 @@ namespace libtorrent if (i->banned) throw protocol_error("ip address banned, disconnected"); } - i->connected = boost::posix_time::second_clock::local_time(); i->connection = &c; + i->connected = boost::posix_time::second_clock::local_time(); } void policy::peer_from_tracker(const address& remote, const peer_id& id) @@ -524,11 +558,11 @@ namespace libtorrent return; } - if (i->banned) return; - - i->connected = boost::posix_time::second_clock::local_time(); - i->connection = &m_torrent->connect_to_peer(remote, id); +// if (i->banned) return; +// i->connected = boost::posix_time::second_clock::local_time(); +// i->connection = &m_torrent->connect_to_peer(remote, id); + return; } catch(network_error& e) { @@ -631,6 +665,17 @@ namespace libtorrent return true; } + bool policy::connect_one_peer() + { + peer* p = find_connect_candidate(); + if (p==0) return false; + assert(!p->banned); + + p->connection = &m_torrent->connect_to_peer(p->ip, p->id); + p->connected = boost::posix_time::second_clock::local_time(); + return true; + } + // this is called whenever a peer connection is closed void policy::connection_closed(const peer_connection& c) { @@ -701,11 +746,15 @@ namespace libtorrent , ip(a) , last_optimistically_unchoked( boost::gregorian::date(1970,boost::gregorian::Jan,1)) - , connected(boost::posix_time::second_clock::local_time()) + //, connected(boost::posix_time::second_clock::local_time()) + , connected(boost::gregorian::date(1970,boost::gregorian::Jan,1)) , prev_amount_upload(0) , prev_amount_download(0) , banned(false) - {} + , connection(0) + { + assert(connected < boost::posix_time::second_clock::local_time()); + } int policy::peer::total_download() const {