policy fix when allowing multiple connections per IP

This commit is contained in:
Arvid Norberg 2007-09-22 16:24:26 +00:00
parent 87c079033d
commit 1964cc0596
1 changed files with 22 additions and 5 deletions

View File

@ -162,6 +162,18 @@ namespace
tcp::endpoint const& m_ep; tcp::endpoint const& m_ep;
}; };
struct match_peer_id
{
match_peer_id(peer_id const& id_)
: m_id(id_)
{}
bool operator()(policy::peer const& p) const
{ return p.connection && p.connection->pid() == m_id; }
peer_id const& m_id;
};
struct match_peer_connection struct match_peer_connection
{ {
match_peer_connection(peer_connection const& c) match_peer_connection(peer_connection const& c)
@ -1030,6 +1042,12 @@ namespace libtorrent
m_peers.begin() m_peers.begin()
, m_peers.end() , m_peers.end()
, match_peer_endpoint(remote)); , match_peer_endpoint(remote));
if (i == m_peers.end())
i = std::find_if(
m_peers.begin()
, m_peers.end()
, match_peer_id(pid));
} }
else else
{ {
@ -1156,7 +1174,7 @@ namespace libtorrent
// data from now on // data from now on
void policy::unchoked(peer_connection& c) void policy::unchoked(peer_connection& c)
{ {
INVARIANT_CHECK; // INVARIANT_CHECK;
if (c.is_interesting()) if (c.is_interesting())
{ {
request_a_block(*m_torrent, c); request_a_block(*m_torrent, c);
@ -1166,7 +1184,7 @@ namespace libtorrent
// called when a peer is interested in us // called when a peer is interested in us
void policy::interested(peer_connection& c) void policy::interested(peer_connection& c)
{ {
INVARIANT_CHECK; // INVARIANT_CHECK;
assert(std::find_if(m_peers.begin(), m_peers.end() assert(std::find_if(m_peers.begin(), m_peers.end()
, boost::bind<bool>(std::equal_to<peer_connection*>(), bind(&peer::connection, _1) , boost::bind<bool>(std::equal_to<peer_connection*>(), bind(&peer::connection, _1)
@ -1278,7 +1296,7 @@ namespace libtorrent
*/ */
bool policy::connect_one_peer() bool policy::connect_one_peer()
{ {
INVARIANT_CHECK; // INVARIANT_CHECK;
assert(m_torrent->want_more_peers()); assert(m_torrent->want_more_peers());
@ -1291,7 +1309,6 @@ namespace libtorrent
try try
{ {
INVARIANT_CHECK;
p->connected = time_now(); p->connected = time_now();
p->connection = m_torrent->connect_to_peer(&*p); p->connection = m_torrent->connect_to_peer(&*p);
assert(p->connection == m_torrent->connection_for(p->ip)); assert(p->connection == m_torrent->connection_for(p->ip));
@ -1375,7 +1392,7 @@ namespace libtorrent
void policy::peer_is_interesting(peer_connection& c) void policy::peer_is_interesting(peer_connection& c)
{ {
INVARIANT_CHECK; // INVARIANT_CHECK;
c.send_interested(); c.send_interested();
if (c.has_peer_choked() if (c.has_peer_choked()