PEX optimization
This commit is contained in:
parent
3fd5405fa9
commit
5ed3daa49a
|
@ -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());
|
||||
|
|
Loading…
Reference in New Issue