made the peer exchange messages be non diffs the first time
This commit is contained in:
parent
f2778d52d1
commit
cb27cd3b73
|
@ -1,3 +1,5 @@
|
||||||
|
* improvements to ut_pex messages, including support for seed flag
|
||||||
|
* prioritizes upload bandwidth to peers that might send back data
|
||||||
* the following functions have been deprecated:
|
* the following functions have been deprecated:
|
||||||
void torrent_handle::filter_piece(int index, bool filter) const;
|
void torrent_handle::filter_piece(int index, bool filter) const;
|
||||||
void torrent_handle::filter_pieces(std::vector<bool> const& pieces) const;
|
void torrent_handle::filter_pieces(std::vector<bool> const& pieces) const;
|
||||||
|
|
|
@ -60,6 +60,18 @@ namespace libtorrent { namespace
|
||||||
max_peer_entries = 100
|
max_peer_entries = 100
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool send_peer(peer_connection const& p)
|
||||||
|
{
|
||||||
|
// don't send out peers that we haven't connected to
|
||||||
|
// (that have connected to us)
|
||||||
|
if (!p.is_local()) return false;
|
||||||
|
// don't send out peers that we haven't successfully connected to
|
||||||
|
if (p.is_connecting()) return false;
|
||||||
|
// ut pex does not support IPv6
|
||||||
|
if (!p.remote().address().is_v4()) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
struct ut_pex_plugin: torrent_plugin
|
struct ut_pex_plugin: torrent_plugin
|
||||||
{
|
{
|
||||||
ut_pex_plugin(torrent& t): m_torrent(t), m_1_minute(0) {}
|
ut_pex_plugin(torrent& t): m_torrent(t), m_1_minute(0) {}
|
||||||
|
@ -96,14 +108,8 @@ namespace libtorrent { namespace
|
||||||
int num_added = 0;
|
int num_added = 0;
|
||||||
for (torrent::peer_iterator i = m_torrent.begin()
|
for (torrent::peer_iterator i = m_torrent.begin()
|
||||||
, end(m_torrent.end()); i != end; ++i)
|
, end(m_torrent.end()); i != end; ++i)
|
||||||
{
|
{
|
||||||
// don't send out peers that we haven't connected to
|
if (!send_peer(*i->second)) continue;
|
||||||
// (that have connected to us)
|
|
||||||
if (!i->second->is_local()) continue;
|
|
||||||
// don't send out peers that we haven't successfully connected to
|
|
||||||
if (i->second->is_connecting()) continue;
|
|
||||||
// ut pex does not support IPv6
|
|
||||||
if (!i->first.address().is_v4()) continue;
|
|
||||||
|
|
||||||
m_old_peers.insert(i->first);
|
m_old_peers.insert(i->first);
|
||||||
|
|
||||||
|
@ -158,6 +164,7 @@ namespace libtorrent { namespace
|
||||||
, m_tp(tp)
|
, m_tp(tp)
|
||||||
, m_1_minute(0)
|
, m_1_minute(0)
|
||||||
, m_message_index(0)
|
, m_message_index(0)
|
||||||
|
, m_first_time(true)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual void add_handshake(entry& h)
|
virtual void add_handshake(entry& h)
|
||||||
|
@ -193,10 +200,6 @@ namespace libtorrent { namespace
|
||||||
|
|
||||||
if (body.left() < length) return true;
|
if (body.left() < length) return true;
|
||||||
|
|
||||||
// in case we are a seed we do not use the peers
|
|
||||||
// from the pex message to prevent us from
|
|
||||||
// overloading ourself
|
|
||||||
|
|
||||||
entry pex_msg = bdecode(body.begin, body.end);
|
entry pex_msg = bdecode(body.begin, body.end);
|
||||||
std::string const& peers = pex_msg["added"].string();
|
std::string const& peers = pex_msg["added"].string();
|
||||||
std::string const& peer_flags = pex_msg["added.f"].string();
|
std::string const& peer_flags = pex_msg["added.f"].string();
|
||||||
|
@ -230,15 +233,66 @@ namespace libtorrent { namespace
|
||||||
if (!m_message_index) return; // no handshake yet
|
if (!m_message_index) return; // no handshake yet
|
||||||
if (++m_1_minute <= 60) return;
|
if (++m_1_minute <= 60) return;
|
||||||
|
|
||||||
send_ut_peer_list();
|
if (m_first_time)
|
||||||
|
{
|
||||||
|
send_ut_peer_list();
|
||||||
|
m_first_time = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
send_ut_peer_diff();
|
||||||
|
}
|
||||||
m_1_minute = 0;
|
m_1_minute = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void send_ut_peer_diff()
|
||||||
|
{
|
||||||
|
std::vector<char> const& pex_msg = m_tp.get_ut_pex_msg();
|
||||||
|
|
||||||
|
buffer::interval i = m_pc.allocate_send_buffer(6 + pex_msg.size());
|
||||||
|
|
||||||
|
detail::write_uint32(1 + 1 + pex_msg.size(), i.begin);
|
||||||
|
detail::write_uint8(bt_peer_connection::msg_extended, i.begin);
|
||||||
|
detail::write_uint8(m_message_index, i.begin);
|
||||||
|
std::copy(pex_msg.begin(), pex_msg.end(), i.begin);
|
||||||
|
i.begin += pex_msg.size();
|
||||||
|
|
||||||
|
assert(i.begin == i.end);
|
||||||
|
m_pc.setup_send();
|
||||||
|
}
|
||||||
|
|
||||||
void send_ut_peer_list()
|
void send_ut_peer_list()
|
||||||
{
|
{
|
||||||
std::vector<char>& pex_msg = m_tp.get_ut_pex_msg();
|
entry pex;
|
||||||
|
// leave the dropped string empty
|
||||||
|
pex["dropped"].string();
|
||||||
|
std::string& pla = pex["added"].string();
|
||||||
|
std::string& plf = pex["added.f"].string();
|
||||||
|
std::back_insert_iterator<std::string> pla_out(pla);
|
||||||
|
std::back_insert_iterator<std::string> plf_out(plf);
|
||||||
|
|
||||||
|
int num_added = 0;
|
||||||
|
for (torrent::peer_iterator i = m_torrent.begin()
|
||||||
|
, end(m_torrent.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
if (!send_peer(*i->second)) continue;
|
||||||
|
|
||||||
|
// don't write too big of a package
|
||||||
|
if (num_added >= max_peer_entries) continue;
|
||||||
|
|
||||||
|
// i->first was added since the last time
|
||||||
|
detail::write_endpoint(i->first, pla_out);
|
||||||
|
// no supported flags to set yet
|
||||||
|
// 0x01 - peer supports encryption
|
||||||
|
// 0x02 - peer is a seed
|
||||||
|
int flags = i->second->is_seed() ? 2 : 0;
|
||||||
|
detail::write_uint8(flags, plf_out);
|
||||||
|
++num_added;
|
||||||
|
}
|
||||||
|
std::vector<char> pex_msg;
|
||||||
|
bencode(std::back_inserter(pex_msg), pex);
|
||||||
|
|
||||||
buffer::interval i = m_pc.allocate_send_buffer(6 + pex_msg.size());
|
buffer::interval i = m_pc.allocate_send_buffer(6 + pex_msg.size());
|
||||||
|
|
||||||
|
@ -257,6 +311,12 @@ namespace libtorrent { namespace
|
||||||
ut_pex_plugin& m_tp;
|
ut_pex_plugin& m_tp;
|
||||||
int m_1_minute;
|
int m_1_minute;
|
||||||
int m_message_index;
|
int m_message_index;
|
||||||
|
|
||||||
|
// this is initialized to true, and set to
|
||||||
|
// false after the first pex message has been sent.
|
||||||
|
// it is used to know if a diff message or a full
|
||||||
|
// message should be sent.
|
||||||
|
bool m_first_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
boost::shared_ptr<peer_plugin> ut_pex_plugin::new_connection(peer_connection* pc)
|
boost::shared_ptr<peer_plugin> ut_pex_plugin::new_connection(peer_connection* pc)
|
||||||
|
|
Loading…
Reference in New Issue