PEX optimization

This commit is contained in:
Arvid Norberg 2008-11-26 08:27:57 +00:00
parent 3fd5405fa9
commit 5ed3daa49a
1 changed files with 14 additions and 2 deletions

View File

@ -72,7 +72,7 @@ namespace libtorrent { namespace
struct ut_pex_plugin: torrent_plugin
{
ut_pex_plugin(torrent& t): m_torrent(t), m_1_minute(55) {}
ut_pex_plugin(torrent& t): m_torrent(t), m_1_minute(55), m_peers_in_message(0) {}
virtual boost::shared_ptr<peer_plugin> new_connection(peer_connection* pc);
@ -81,6 +81,11 @@ namespace libtorrent { namespace
return m_ut_pex_msg;
}
int peers_in_msg() const
{
return m_peers_in_message;
}
// the second tick of the torrent
// each minute the new lists of "added" + "added.f" and "dropped"
// are calculated here and the pex message is created
@ -109,6 +114,7 @@ namespace libtorrent { namespace
std::set<tcp::endpoint> dropped;
m_old_peers.swap(dropped);
m_peers_in_message = 0;
int num_added = 0;
for (torrent::peer_iterator i = m_torrent.begin()
, end(m_torrent.end()); i != end; ++i)
@ -148,6 +154,7 @@ namespace libtorrent { namespace
detail::write_uint8(flags, plf6_out);
}
++num_added;
++m_peers_in_message;
}
else
{
@ -164,6 +171,7 @@ namespace libtorrent { namespace
detail::write_endpoint(*i, pld_out);
else
detail::write_endpoint(*i, pld6_out);
++m_peers_in_message;
}
m_ut_pex_msg.clear();
@ -176,6 +184,7 @@ namespace libtorrent { namespace
std::set<tcp::endpoint> m_old_peers;
int m_1_minute;
std::vector<char> m_ut_pex_msg;
int m_peers_in_message;
};
@ -224,7 +233,7 @@ namespace libtorrent { namespace
lazy_entry pex_msg;
int ret = lazy_bdecode(body.begin, body.end, pex_msg);
if (pex_msg.type() != lazy_entry::dict_t)
if (ret != 0 || pex_msg.type() != lazy_entry::dict_t)
{
m_pc.disconnect("invalid bencoding in ut_metadata message", 2);
return true;
@ -300,6 +309,9 @@ namespace libtorrent { namespace
void send_ut_peer_diff()
{
// if there's no change in out peer set, don't send anything
if (m_tp.peers_in_msg() == 0) return;
std::vector<char> const& pex_msg = m_tp.get_ut_pex_msg();
buffer::interval i = m_pc.allocate_send_buffer(6 + pex_msg.size());