forked from premiere/premiere-libtorrent
added source to peer_info, which is a bitmask of the sources where the peer has been acquired from
This commit is contained in:
parent
009b10e9bf
commit
3ed24da320
|
@ -1188,7 +1188,7 @@ Its declaration looks like this::
|
||||||
|
|
||||||
entry write_resume_data() const;
|
entry write_resume_data() const;
|
||||||
void force_reannounce() const;
|
void force_reannounce() const;
|
||||||
void connect_peer(asio::ip::tcp::endpoint const& adr) const;
|
void connect_peer(asio::ip::tcp::endpoint const& adr, int source = 0) const;
|
||||||
|
|
||||||
void set_tracker_login(std::string const& username
|
void set_tracker_login(std::string const& username
|
||||||
, std::string const& password) const;
|
, std::string const& password) const;
|
||||||
|
@ -1361,13 +1361,15 @@ connect_peer()
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
void connect_peer(asio::ip::tcp::endpoint const& adr) const;
|
void connect_peer(asio::ip::tcp::endpoint const& adr, int source = 0) const;
|
||||||
|
|
||||||
``connect_peer()`` is a way to manually connect to peers that one believe is a part of the
|
``connect_peer()`` is a way to manually connect to peers that one believe is a part of the
|
||||||
torrent. If the peer does not respond, or is not a member of this torrent, it will simply
|
torrent. If the peer does not respond, or is not a member of this torrent, it will simply
|
||||||
be disconnected. No harm can be done by using this other than an unnecessary connection
|
be disconnected. No harm can be done by using this other than an unnecessary connection
|
||||||
attempt is made. If the torrent is uninitialized or in queued or checking mode, this
|
attempt is made. If the torrent is uninitialized or in queued or checking mode, this
|
||||||
will throw invalid_handle_.
|
will throw invalid_handle_. The second (optional) argument will be bitwised ORed into
|
||||||
|
the source mask of this peer. Typically this is one of the source flags in peer_info_.
|
||||||
|
i.e. ``tracker``, ``pex``, ``dht`` etc.
|
||||||
|
|
||||||
|
|
||||||
name()
|
name()
|
||||||
|
@ -1907,7 +1909,19 @@ It contains the following fields::
|
||||||
connecting = 0x80,
|
connecting = 0x80,
|
||||||
queued = 0x100
|
queued = 0x100
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
||||||
|
enum peer_source_flags
|
||||||
|
{
|
||||||
|
tracker = 0x1,
|
||||||
|
dht = 0x2,
|
||||||
|
pex = 0x4,
|
||||||
|
lsd = 0x8
|
||||||
|
};
|
||||||
|
|
||||||
|
int source;
|
||||||
|
|
||||||
asio::ip::tcp::endpoint ip;
|
asio::ip::tcp::endpoint ip;
|
||||||
float up_speed;
|
float up_speed;
|
||||||
float down_speed;
|
float down_speed;
|
||||||
|
@ -1978,6 +1992,23 @@ any combination of the enums above. The following table describes each flag:
|
||||||
|
|
||||||
__ extension_protocol.html
|
__ extension_protocol.html
|
||||||
|
|
||||||
|
``source`` is a combination of flags describing from which sources this peer
|
||||||
|
was received. The flags are:
|
||||||
|
|
||||||
|
+------------------------+--------------------------------------------------------+
|
||||||
|
| ``tracker`` | The peer was received from the tracker. |
|
||||||
|
+------------------------+--------------------------------------------------------+
|
||||||
|
| ``dht`` | The peer was received from the kademlia DHT. |
|
||||||
|
+------------------------+--------------------------------------------------------+
|
||||||
|
| ``pex`` | The peer was received from the peer exchange |
|
||||||
|
| | extension. |
|
||||||
|
+------------------------+--------------------------------------------------------+
|
||||||
|
| ``lsd`` | The peer was received from the local service |
|
||||||
|
| | discovery (The peer is on the local network). |
|
||||||
|
+------------------------+--------------------------------------------------------+
|
||||||
|
| ``resume_data`` | The peer was added from the fast resume data. |
|
||||||
|
+------------------------+--------------------------------------------------------+
|
||||||
|
|
||||||
The ``ip`` field is the IP-address to this peer. The type is an asio endpoint. For
|
The ``ip`` field is the IP-address to this peer. The type is an asio endpoint. For
|
||||||
more info, see the asio_ documentation.
|
more info, see the asio_ documentation.
|
||||||
|
|
||||||
|
|
|
@ -245,7 +245,7 @@ void print_peer_info(std::ostream& out, std::vector<libtorrent::peer_info> const
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
#ifndef ANSI_TERMINAL_COLORS
|
#ifndef ANSI_TERMINAL_COLORS
|
||||||
out << " down (total) up (total) q r flags block progress country client \n";
|
out << " down (total) up (total) q r flags source block progress country client \n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (std::vector<peer_info>::const_iterator i = peers.begin();
|
for (std::vector<peer_info>::const_iterator i = peers.begin();
|
||||||
|
@ -267,7 +267,13 @@ void print_peer_info(std::ostream& out, std::vector<libtorrent::peer_info> const
|
||||||
<< ((i->flags & peer_info::remote_interested)?'i':'.')
|
<< ((i->flags & peer_info::remote_interested)?'i':'.')
|
||||||
<< ((i->flags & peer_info::remote_choked)?'c':'.')
|
<< ((i->flags & peer_info::remote_choked)?'c':'.')
|
||||||
<< ((i->flags & peer_info::supports_extensions)?'e':'.')
|
<< ((i->flags & peer_info::supports_extensions)?'e':'.')
|
||||||
<< ((i->flags & peer_info::local_connection)?'l':'r') << " ";
|
<< ((i->flags & peer_info::local_connection)?'l':'r') << " "
|
||||||
|
<< ((i->source & peer_info::tracker)?"T":"_")
|
||||||
|
<< ((i->source & peer_info::pex)?"P":"_")
|
||||||
|
<< ((i->source & peer_info::dht)?"D":"_")
|
||||||
|
<< ((i->source & peer_info::lsd)?"L":"_")
|
||||||
|
<< ((i->source & peer_info::resume_data)?"R":"_")
|
||||||
|
<< " ";
|
||||||
|
|
||||||
if (i->downloading_piece_index >= 0)
|
if (i->downloading_piece_index >= 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,13 +91,15 @@ namespace libtorrent
|
||||||
aux::session_impl& ses
|
aux::session_impl& ses
|
||||||
, boost::weak_ptr<torrent> t
|
, boost::weak_ptr<torrent> t
|
||||||
, boost::shared_ptr<stream_socket> s
|
, boost::shared_ptr<stream_socket> s
|
||||||
, tcp::endpoint const& remote);
|
, tcp::endpoint const& remote
|
||||||
|
, policy::peer* peerinfo);
|
||||||
|
|
||||||
// with this constructor we have been contacted and we still don't
|
// with this constructor we have been contacted and we still don't
|
||||||
// know which torrent the connection belongs to
|
// know which torrent the connection belongs to
|
||||||
bt_peer_connection(
|
bt_peer_connection(
|
||||||
aux::session_impl& ses
|
aux::session_impl& ses
|
||||||
, boost::shared_ptr<stream_socket> s);
|
, boost::shared_ptr<stream_socket> s
|
||||||
|
, policy::peer* peerinfo);
|
||||||
|
|
||||||
~bt_peer_connection();
|
~bt_peer_connection();
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
#include "libtorrent/session.hpp"
|
#include "libtorrent/session.hpp"
|
||||||
#include "libtorrent/bandwidth_manager.hpp"
|
#include "libtorrent/bandwidth_manager.hpp"
|
||||||
|
#include "libtorrent/policy.hpp"
|
||||||
|
|
||||||
// TODO: each time a block is 'taken over'
|
// TODO: each time a block is 'taken over'
|
||||||
// from another peer. That peer must be given
|
// from another peer. That peer must be given
|
||||||
|
@ -117,16 +118,27 @@ namespace libtorrent
|
||||||
, boost::weak_ptr<torrent> t
|
, boost::weak_ptr<torrent> t
|
||||||
, boost::shared_ptr<stream_socket> s
|
, boost::shared_ptr<stream_socket> s
|
||||||
, tcp::endpoint const& remote
|
, tcp::endpoint const& remote
|
||||||
, tcp::endpoint const& proxy);
|
, tcp::endpoint const& proxy
|
||||||
|
, policy::peer* peerinfo);
|
||||||
|
|
||||||
// with this constructor we have been contacted and we still don't
|
// with this constructor we have been contacted and we still don't
|
||||||
// know which torrent the connection belongs to
|
// know which torrent the connection belongs to
|
||||||
peer_connection(
|
peer_connection(
|
||||||
aux::session_impl& ses
|
aux::session_impl& ses
|
||||||
, boost::shared_ptr<stream_socket> s);
|
, boost::shared_ptr<stream_socket> s
|
||||||
|
, policy::peer* peerinfo);
|
||||||
|
|
||||||
virtual ~peer_connection();
|
virtual ~peer_connection();
|
||||||
|
|
||||||
|
void set_peer_info(policy::peer* pi)
|
||||||
|
{
|
||||||
|
assert(m_peer_info == 0);
|
||||||
|
m_peer_info = pi;
|
||||||
|
}
|
||||||
|
|
||||||
|
policy::peer* peer_info_struct() const
|
||||||
|
{ return m_peer_info; }
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
void add_extension(boost::shared_ptr<peer_plugin>);
|
void add_extension(boost::shared_ptr<peer_plugin>);
|
||||||
#endif
|
#endif
|
||||||
|
@ -640,6 +652,11 @@ namespace libtorrent
|
||||||
int m_upload_limit;
|
int m_upload_limit;
|
||||||
int m_download_limit;
|
int m_download_limit;
|
||||||
|
|
||||||
|
// this peer's peer info struct. This may
|
||||||
|
// be 0, in case the connection is incoming
|
||||||
|
// and hasn't been added to a torrent yet.
|
||||||
|
policy::peer* m_peer_info;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
public:
|
public:
|
||||||
bool m_in_constructor;
|
bool m_in_constructor;
|
||||||
|
|
|
@ -56,7 +56,20 @@ namespace libtorrent
|
||||||
connecting = 0x80,
|
connecting = 0x80,
|
||||||
queued = 0x100
|
queued = 0x100
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
||||||
|
enum peer_source_flags
|
||||||
|
{
|
||||||
|
tracker = 0x1,
|
||||||
|
dht = 0x2,
|
||||||
|
pex = 0x4,
|
||||||
|
lsd = 0x8,
|
||||||
|
resume_data = 0x10
|
||||||
|
};
|
||||||
|
|
||||||
|
int source;
|
||||||
|
|
||||||
tcp::endpoint ip;
|
tcp::endpoint ip;
|
||||||
float up_speed;
|
float up_speed;
|
||||||
float down_speed;
|
float down_speed;
|
||||||
|
|
|
@ -84,9 +84,9 @@ namespace libtorrent
|
||||||
void pulse();
|
void pulse();
|
||||||
|
|
||||||
// this is called once for every peer we get from
|
// this is called once for every peer we get from
|
||||||
// the tracker
|
// the tracker, pex, lsd or dht.
|
||||||
void peer_from_tracker(const tcp::endpoint& remote, const peer_id& pid
|
void peer_from_tracker(const tcp::endpoint& remote, const peer_id& pid
|
||||||
, char flags = 0);
|
, int source, char flags);
|
||||||
|
|
||||||
// called when an incoming connection is accepted
|
// called when an incoming connection is accepted
|
||||||
void new_connection(peer_connection& c);
|
void new_connection(peer_connection& c);
|
||||||
|
@ -135,7 +135,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
enum connection_type { not_connectable,connectable };
|
enum connection_type { not_connectable,connectable };
|
||||||
|
|
||||||
peer(const tcp::endpoint& ip, connection_type t);
|
peer(const tcp::endpoint& ip, connection_type t, int src);
|
||||||
|
|
||||||
size_type total_download() const;
|
size_type total_download() const;
|
||||||
size_type total_upload() const;
|
size_type total_upload() const;
|
||||||
|
@ -176,6 +176,10 @@ namespace libtorrent
|
||||||
// is set to true if this peer has been banned
|
// is set to true if this peer has been banned
|
||||||
bool banned;
|
bool banned;
|
||||||
|
|
||||||
|
// a bitmap combining the peer_source flags
|
||||||
|
// from peer_info.
|
||||||
|
int source;
|
||||||
|
|
||||||
// if the peer is connected now, this
|
// if the peer is connected now, this
|
||||||
// will refer to a valid peer_connection
|
// will refer to a valid peer_connection
|
||||||
peer_connection* connection;
|
peer_connection* connection;
|
||||||
|
@ -191,7 +195,8 @@ namespace libtorrent
|
||||||
return m_num_unchoked;
|
return m_num_unchoked;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::vector<peer>::iterator iterator;
|
typedef std::list<peer>::iterator iterator;
|
||||||
|
typedef std::list<peer>::const_iterator const_iterator;
|
||||||
iterator begin_peer() { return m_peers.begin(); }
|
iterator begin_peer() { return m_peers.begin(); }
|
||||||
iterator end_peer() { return m_peers.end(); }
|
iterator end_peer() { return m_peers.end(); }
|
||||||
|
|
||||||
|
@ -231,7 +236,7 @@ namespace libtorrent
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
std::vector<peer> m_peers;
|
std::list<peer> m_peers;
|
||||||
|
|
||||||
torrent* m_torrent;
|
torrent* m_torrent;
|
||||||
|
|
||||||
|
|
|
@ -181,7 +181,6 @@ namespace libtorrent
|
||||||
void filter_files(std::vector<bool> const& files);
|
void filter_files(std::vector<bool> const& files);
|
||||||
// ============ end deprecation =============
|
// ============ end deprecation =============
|
||||||
|
|
||||||
|
|
||||||
void set_piece_priority(int index, int priority);
|
void set_piece_priority(int index, int priority);
|
||||||
int piece_priority(int index) const;
|
int piece_priority(int index) const;
|
||||||
|
|
||||||
|
@ -190,7 +189,6 @@ namespace libtorrent
|
||||||
|
|
||||||
void prioritize_files(std::vector<int> const& files);
|
void prioritize_files(std::vector<int> const& files);
|
||||||
|
|
||||||
|
|
||||||
torrent_status status() const;
|
torrent_status status() const;
|
||||||
void file_progress(std::vector<float>& fp) const;
|
void file_progress(std::vector<float>& fp) const;
|
||||||
|
|
||||||
|
@ -198,7 +196,7 @@ namespace libtorrent
|
||||||
tcp::endpoint const& get_interface() const { return m_net_interface; }
|
tcp::endpoint const& get_interface() const { return m_net_interface; }
|
||||||
|
|
||||||
void connect_to_url_seed(std::string const& url);
|
void connect_to_url_seed(std::string const& url);
|
||||||
peer_connection& connect_to_peer(tcp::endpoint const& a);
|
peer_connection& connect_to_peer(policy::peer* peerinfo);
|
||||||
|
|
||||||
void set_ratio(float ratio)
|
void set_ratio(float ratio)
|
||||||
{ assert(ratio >= 0.0f); m_ratio = ratio; }
|
{ assert(ratio >= 0.0f); m_ratio = ratio; }
|
||||||
|
|
|
@ -311,7 +311,7 @@ namespace libtorrent
|
||||||
void set_peer_download_limit(tcp::endpoint ip, int limit) const;
|
void set_peer_download_limit(tcp::endpoint ip, int limit) const;
|
||||||
|
|
||||||
// manually connect a peer
|
// manually connect a peer
|
||||||
void connect_peer(tcp::endpoint const& adr) const;
|
void connect_peer(tcp::endpoint const& adr, int source = 0) const;
|
||||||
|
|
||||||
// valid ratios are 0 (infinite ratio) or [ 1.0 , inf )
|
// valid ratios are 0 (infinite ratio) or [ 1.0 , inf )
|
||||||
// the ratio is uploaded / downloaded. less than 1 is not allowed
|
// the ratio is uploaded / downloaded. less than 1 is not allowed
|
||||||
|
|
|
@ -98,7 +98,8 @@ namespace libtorrent
|
||||||
, boost::shared_ptr<stream_socket> s
|
, boost::shared_ptr<stream_socket> s
|
||||||
, tcp::endpoint const& remote
|
, tcp::endpoint const& remote
|
||||||
, tcp::endpoint const& proxy
|
, tcp::endpoint const& proxy
|
||||||
, std::string const& url);
|
, std::string const& url
|
||||||
|
, policy::peer* peerinfo);
|
||||||
|
|
||||||
~web_peer_connection();
|
~web_peer_connection();
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,10 @@ namespace libtorrent
|
||||||
session_impl& ses
|
session_impl& ses
|
||||||
, boost::weak_ptr<torrent> tor
|
, boost::weak_ptr<torrent> tor
|
||||||
, shared_ptr<stream_socket> s
|
, shared_ptr<stream_socket> s
|
||||||
, tcp::endpoint const& remote)
|
, tcp::endpoint const& remote
|
||||||
: peer_connection(ses, tor, s, remote, tcp::endpoint())
|
, policy::peer* peerinfo)
|
||||||
|
: peer_connection(ses, tor, s, remote
|
||||||
|
, tcp::endpoint(), peerinfo)
|
||||||
, m_state(read_protocol_length)
|
, m_state(read_protocol_length)
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
, m_supports_extensions(false)
|
, m_supports_extensions(false)
|
||||||
|
@ -117,8 +119,9 @@ namespace libtorrent
|
||||||
|
|
||||||
bt_peer_connection::bt_peer_connection(
|
bt_peer_connection::bt_peer_connection(
|
||||||
session_impl& ses
|
session_impl& ses
|
||||||
, boost::shared_ptr<stream_socket> s)
|
, boost::shared_ptr<stream_socket> s
|
||||||
: peer_connection(ses, s)
|
, policy::peer* peerinfo)
|
||||||
|
: peer_connection(ses, s, peerinfo)
|
||||||
, m_state(read_protocol_length)
|
, m_state(read_protocol_length)
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
, m_supports_extensions(false)
|
, m_supports_extensions(false)
|
||||||
|
@ -240,6 +243,16 @@ namespace libtorrent
|
||||||
|
|
||||||
p.client = m_client_version;
|
p.client = m_client_version;
|
||||||
p.connection_type = peer_info::standard_bittorrent;
|
p.connection_type = peer_info::standard_bittorrent;
|
||||||
|
|
||||||
|
if (peer_info_struct())
|
||||||
|
{
|
||||||
|
p.source = peer_info_struct()->source;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(!is_local());
|
||||||
|
p.source = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bt_peer_connection::in_handshake() const
|
bool bt_peer_connection::in_handshake() const
|
||||||
|
@ -692,7 +705,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
tcp::endpoint adr(remote().address()
|
tcp::endpoint adr(remote().address()
|
||||||
, (unsigned short)listen_port->integer());
|
, (unsigned short)listen_port->integer());
|
||||||
t->get_policy().peer_from_tracker(adr, pid());
|
t->get_policy().peer_from_tracker(adr, pid(), 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// there should be a version too
|
// there should be a version too
|
||||||
|
|
|
@ -49,6 +49,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/version.hpp"
|
#include "libtorrent/version.hpp"
|
||||||
#include "libtorrent/extensions.hpp"
|
#include "libtorrent/extensions.hpp"
|
||||||
#include "libtorrent/aux_/session_impl.hpp"
|
#include "libtorrent/aux_/session_impl.hpp"
|
||||||
|
#include "libtorrent/policy.hpp"
|
||||||
|
|
||||||
using boost::bind;
|
using boost::bind;
|
||||||
using boost::shared_ptr;
|
using boost::shared_ptr;
|
||||||
|
@ -77,7 +78,8 @@ namespace libtorrent
|
||||||
, boost::weak_ptr<torrent> tor
|
, boost::weak_ptr<torrent> tor
|
||||||
, shared_ptr<stream_socket> s
|
, shared_ptr<stream_socket> s
|
||||||
, tcp::endpoint const& remote
|
, tcp::endpoint const& remote
|
||||||
, tcp::endpoint const& proxy)
|
, tcp::endpoint const& proxy
|
||||||
|
, policy::peer* peerinfo)
|
||||||
:
|
:
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
m_last_choke(time_now() - hours(1))
|
m_last_choke(time_now() - hours(1))
|
||||||
|
@ -122,6 +124,7 @@ namespace libtorrent
|
||||||
, m_refs(0)
|
, m_refs(0)
|
||||||
, m_upload_limit(resource_request::inf)
|
, m_upload_limit(resource_request::inf)
|
||||||
, m_download_limit(resource_request::inf)
|
, m_download_limit(resource_request::inf)
|
||||||
|
, m_peer_info(peerinfo)
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
, m_in_constructor(true)
|
, m_in_constructor(true)
|
||||||
#endif
|
#endif
|
||||||
|
@ -143,7 +146,8 @@ namespace libtorrent
|
||||||
|
|
||||||
peer_connection::peer_connection(
|
peer_connection::peer_connection(
|
||||||
session_impl& ses
|
session_impl& ses
|
||||||
, boost::shared_ptr<stream_socket> s)
|
, boost::shared_ptr<stream_socket> s
|
||||||
|
, policy::peer* peerinfo)
|
||||||
:
|
:
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
m_last_choke(time_now() - hours(1))
|
m_last_choke(time_now() - hours(1))
|
||||||
|
@ -185,6 +189,7 @@ namespace libtorrent
|
||||||
, m_refs(0)
|
, m_refs(0)
|
||||||
, m_upload_limit(resource_request::inf)
|
, m_upload_limit(resource_request::inf)
|
||||||
, m_download_limit(resource_request::inf)
|
, m_download_limit(resource_request::inf)
|
||||||
|
, m_peer_info(peerinfo)
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
, m_in_constructor(true)
|
, m_in_constructor(true)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,6 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
#include <boost/utility.hpp>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
@ -393,7 +394,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// TODO: make this selection better
|
// TODO: make this selection better
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* c = i->connection;
|
peer_connection* c = i->connection;
|
||||||
|
@ -440,7 +441,7 @@ namespace libtorrent
|
||||||
|
|
||||||
// TODO: make this selection better
|
// TODO: make this selection better
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* c = i->connection;
|
peer_connection* c = i->connection;
|
||||||
|
@ -466,7 +467,7 @@ namespace libtorrent
|
||||||
|
|
||||||
ptime local_time = time_now();
|
ptime local_time = time_now();
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* c = i->connection;
|
peer_connection* c = i->connection;
|
||||||
|
@ -502,7 +503,7 @@ namespace libtorrent
|
||||||
ptime ptime(now);
|
ptime ptime(now);
|
||||||
policy::peer* candidate = 0;
|
policy::peer* candidate = 0;
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
if (i->connection) continue;
|
if (i->connection) continue;
|
||||||
|
@ -545,7 +546,7 @@ namespace libtorrent
|
||||||
peer* second_candidate = 0;
|
peer* second_candidate = 0;
|
||||||
size_type lowest_share_diff = 0; // not valid when secondCandidate==0
|
size_type lowest_share_diff = 0; // not valid when secondCandidate==0
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* c = i->connection;
|
peer_connection* c = i->connection;
|
||||||
|
@ -588,7 +589,7 @@ namespace libtorrent
|
||||||
peer* candidate = 0;
|
peer* candidate = 0;
|
||||||
ptime last_unchoke = time_now();
|
ptime last_unchoke = time_now();
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* c = i->connection;
|
peer_connection* c = i->connection;
|
||||||
|
@ -652,7 +653,7 @@ namespace libtorrent
|
||||||
// that are currently in the process of disconnecting
|
// that are currently in the process of disconnecting
|
||||||
int num_connected_peers = 0;
|
int num_connected_peers = 0;
|
||||||
|
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
if (i->connection && !i->connection->is_disconnecting())
|
if (i->connection && !i->connection->is_disconnecting())
|
||||||
|
@ -784,7 +785,7 @@ namespace libtorrent
|
||||||
if (m_torrent->ratio() != 0)
|
if (m_torrent->ratio() != 0)
|
||||||
{
|
{
|
||||||
// choke peers that have leeched too much without giving anything back
|
// choke peers that have leeched too much without giving anything back
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
peer_connection* c = i->connection;
|
peer_connection* c = i->connection;
|
||||||
|
@ -849,7 +850,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
std::vector<peer>::iterator i = std::find_if(
|
iterator i = std::find_if(
|
||||||
m_peers.begin()
|
m_peers.begin()
|
||||||
, m_peers.end()
|
, m_peers.end()
|
||||||
, match_peer_connection(c));
|
, match_peer_connection(c));
|
||||||
|
@ -873,7 +874,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
std::vector<peer>::iterator i = std::find_if(
|
iterator i = std::find_if(
|
||||||
m_peers.begin()
|
m_peers.begin()
|
||||||
, m_peers.end()
|
, m_peers.end()
|
||||||
, match_peer_connection(c));
|
, match_peer_connection(c));
|
||||||
|
@ -912,7 +913,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::vector<peer>::iterator i;
|
iterator i;
|
||||||
|
|
||||||
if (m_torrent->settings().allow_multiple_connections_per_ip)
|
if (m_torrent->settings().allow_multiple_connections_per_ip)
|
||||||
{
|
{
|
||||||
|
@ -959,11 +960,12 @@ namespace libtorrent
|
||||||
assert((c.proxy() == tcp::endpoint() && c.remote() == c.get_socket()->remote_endpoint())
|
assert((c.proxy() == tcp::endpoint() && c.remote() == c.get_socket()->remote_endpoint())
|
||||||
|| c.proxy() == c.get_socket()->remote_endpoint());
|
|| c.proxy() == c.get_socket()->remote_endpoint());
|
||||||
|
|
||||||
peer p(c.remote(), peer::not_connectable);
|
peer p(c.remote(), peer::not_connectable, 0);
|
||||||
m_peers.push_back(p);
|
m_peers.push_back(p);
|
||||||
i = m_peers.end()-1;
|
i = boost::prior(m_peers.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.set_peer_info(&*i);
|
||||||
assert(i->connection == 0);
|
assert(i->connection == 0);
|
||||||
c.add_stat(i->prev_amount_download, i->prev_amount_upload);
|
c.add_stat(i->prev_amount_download, i->prev_amount_upload);
|
||||||
i->prev_amount_download = 0;
|
i->prev_amount_download = 0;
|
||||||
|
@ -975,7 +977,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
void policy::peer_from_tracker(const tcp::endpoint& remote, const peer_id& pid
|
void policy::peer_from_tracker(const tcp::endpoint& remote, const peer_id& pid
|
||||||
, char flags)
|
, int src, char flags)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -985,7 +987,7 @@ namespace libtorrent
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::vector<peer>::iterator i;
|
iterator i;
|
||||||
|
|
||||||
if (m_torrent->settings().allow_multiple_connections_per_ip)
|
if (m_torrent->settings().allow_multiple_connections_per_ip)
|
||||||
{
|
{
|
||||||
|
@ -1005,11 +1007,11 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// we don't have any info about this peer.
|
// we don't have any info about this peer.
|
||||||
// add a new entry
|
// add a new entry
|
||||||
peer p(remote, peer::connectable);
|
peer p(remote, peer::connectable, src);
|
||||||
m_peers.push_back(p);
|
m_peers.push_back(p);
|
||||||
// the iterator is invalid
|
// the iterator is invalid
|
||||||
// because of the push_back()
|
// because of the push_back()
|
||||||
i = m_peers.end() - 1;
|
i = boost::prior(m_peers.end());
|
||||||
if (flags & 0x02) p.seed = true;
|
if (flags & 0x02) p.seed = true;
|
||||||
just_added = true;
|
just_added = true;
|
||||||
}
|
}
|
||||||
|
@ -1021,6 +1023,8 @@ namespace libtorrent
|
||||||
// not known, so save it. Client may also have changed port
|
// not known, so save it. Client may also have changed port
|
||||||
// for some reason.
|
// for some reason.
|
||||||
i->ip = remote;
|
i->ip = remote;
|
||||||
|
i->source |= src;
|
||||||
|
|
||||||
if (flags & 0x02) i->seed = true;
|
if (flags & 0x02) i->seed = true;
|
||||||
|
|
||||||
if (i->connection)
|
if (i->connection)
|
||||||
|
@ -1042,6 +1046,7 @@ namespace libtorrent
|
||||||
|
|
||||||
if (i->banned) return;
|
if (i->banned) return;
|
||||||
|
|
||||||
|
// TODO: move the connecting of peers somewhere else!
|
||||||
if (m_torrent->num_peers() < m_torrent->m_connections_quota.given
|
if (m_torrent->num_peers() < m_torrent->m_connections_quota.given
|
||||||
&& !m_torrent->is_paused())
|
&& !m_torrent->is_paused())
|
||||||
{
|
{
|
||||||
|
@ -1050,7 +1055,7 @@ namespace libtorrent
|
||||||
// if this peer was just added, and it
|
// if this peer was just added, and it
|
||||||
// failed to connect. Remove it from the list
|
// failed to connect. Remove it from the list
|
||||||
// (to keep it in sync with the session's list)
|
// (to keep it in sync with the session's list)
|
||||||
assert(i == m_peers.end() - 1);
|
assert(i == boost::prior(m_peers.end()));
|
||||||
m_peers.erase(i);
|
m_peers.erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1082,7 +1087,7 @@ namespace libtorrent
|
||||||
if (successfully_verified)
|
if (successfully_verified)
|
||||||
{
|
{
|
||||||
// have all peers update their interested-flag
|
// have all peers update their interested-flag
|
||||||
for (std::vector<peer>::iterator i = m_peers.begin();
|
for (iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
if (i->connection == 0) continue;
|
if (i->connection == 0) continue;
|
||||||
|
@ -1221,7 +1226,7 @@ namespace libtorrent
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
assert(!p->connection);
|
assert(!p->connection);
|
||||||
p->connection = &m_torrent->connect_to_peer(p->ip);
|
p->connection = &m_torrent->connect_to_peer(p);
|
||||||
assert(p->connection);
|
assert(p->connection);
|
||||||
p->connection->add_stat(p->prev_amount_download, p->prev_amount_upload);
|
p->connection->add_stat(p->prev_amount_download, p->prev_amount_upload);
|
||||||
p->prev_amount_download = 0;
|
p->prev_amount_download = 0;
|
||||||
|
@ -1258,7 +1263,7 @@ namespace libtorrent
|
||||||
bool unchoked = false;
|
bool unchoked = false;
|
||||||
bool erase = false;
|
bool erase = false;
|
||||||
|
|
||||||
std::vector<peer>::iterator i = std::find_if(
|
iterator i = std::find_if(
|
||||||
m_peers.begin()
|
m_peers.begin()
|
||||||
, m_peers.end()
|
, m_peers.end()
|
||||||
, match_peer_connection(c));
|
, match_peer_connection(c));
|
||||||
|
@ -1345,7 +1350,7 @@ namespace libtorrent
|
||||||
int nonempty_connections = 0;
|
int nonempty_connections = 0;
|
||||||
|
|
||||||
|
|
||||||
for (std::vector<peer>::const_iterator i = m_peers.begin();
|
for (const_iterator i = m_peers.begin();
|
||||||
i != m_peers.end(); ++i)
|
i != m_peers.end(); ++i)
|
||||||
{
|
{
|
||||||
++total_connections;
|
++total_connections;
|
||||||
|
@ -1389,7 +1394,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
policy::peer::peer(const tcp::endpoint& ip_, peer::connection_type t)
|
policy::peer::peer(const tcp::endpoint& ip_, peer::connection_type t, int src)
|
||||||
: ip(ip_)
|
: ip(ip_)
|
||||||
, type(t)
|
, type(t)
|
||||||
, failcount(0)
|
, failcount(0)
|
||||||
|
@ -1399,6 +1404,7 @@ namespace libtorrent
|
||||||
, prev_amount_upload(0)
|
, prev_amount_upload(0)
|
||||||
, prev_amount_download(0)
|
, prev_amount_download(0)
|
||||||
, banned(false)
|
, banned(false)
|
||||||
|
, source(src)
|
||||||
, connection(0)
|
, connection(0)
|
||||||
{
|
{
|
||||||
assert(connected < time_now());
|
assert(connected < time_now());
|
||||||
|
|
|
@ -215,7 +215,8 @@ namespace libtorrent { namespace detail
|
||||||
for (std::vector<tcp::endpoint>::const_iterator i = t->peers.begin();
|
for (std::vector<tcp::endpoint>::const_iterator i = t->peers.begin();
|
||||||
i != t->peers.end(); ++i)
|
i != t->peers.end(); ++i)
|
||||||
{
|
{
|
||||||
t->torrent_ptr->get_policy().peer_from_tracker(*i, id);
|
t->torrent_ptr->get_policy().peer_from_tracker(*i, id
|
||||||
|
, peer_info::resume_data, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -337,7 +338,8 @@ namespace libtorrent { namespace detail
|
||||||
for (std::vector<tcp::endpoint>::const_iterator i = processing->peers.begin();
|
for (std::vector<tcp::endpoint>::const_iterator i = processing->peers.begin();
|
||||||
i != processing->peers.end(); ++i)
|
i != processing->peers.end(); ++i)
|
||||||
{
|
{
|
||||||
processing->torrent_ptr->get_policy().peer_from_tracker(*i, id);
|
processing->torrent_ptr->get_policy().peer_from_tracker(*i, id
|
||||||
|
, peer_info::resume_data, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -772,7 +774,7 @@ namespace libtorrent { namespace detail
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::intrusive_ptr<peer_connection> c(
|
boost::intrusive_ptr<peer_connection> c(
|
||||||
new bt_peer_connection(*this, s));
|
new bt_peer_connection(*this, s, 0));
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
c->m_in_constructor = false;
|
c->m_in_constructor = false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1513,7 +1515,7 @@ namespace libtorrent { namespace detail
|
||||||
(*m_logger) << time_now_string()
|
(*m_logger) << time_now_string()
|
||||||
<< ": added peer from local discovery: " << peer << "\n";
|
<< ": added peer from local discovery: " << peer << "\n";
|
||||||
#endif
|
#endif
|
||||||
t->get_policy().peer_from_tracker(peer, peer_id(0));
|
t->get_policy().peer_from_tracker(peer, peer_id(0), peer_info::lsd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void session_impl::on_port_mapping(int tcp_port, int udp_port
|
void session_impl::on_port_mapping(int tcp_port, int udp_port
|
||||||
|
|
|
@ -468,7 +468,8 @@ namespace libtorrent
|
||||||
get_handle(), peers.size(), "Got peers from DHT"));
|
get_handle(), peers.size(), "Got peers from DHT"));
|
||||||
}
|
}
|
||||||
std::for_each(peers.begin(), peers.end(), bind(
|
std::for_each(peers.begin(), peers.end(), bind(
|
||||||
&policy::peer_from_tracker, boost::ref(m_policy), _1, peer_id(0), 0));
|
&policy::peer_from_tracker, boost::ref(m_policy), _1, peer_id(0)
|
||||||
|
, peer_info::dht, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -565,7 +566,7 @@ namespace libtorrent
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_policy->peer_from_tracker(a, i->pid);
|
m_policy->peer_from_tracker(a, i->pid, peer_info::tracker, 0);
|
||||||
}
|
}
|
||||||
catch (std::exception&)
|
catch (std::exception&)
|
||||||
{
|
{
|
||||||
|
@ -607,7 +608,7 @@ namespace libtorrent
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_policy->peer_from_tracker(*host, pid);
|
m_policy->peer_from_tracker(*host, pid, peer_info::tracker, 0);
|
||||||
}
|
}
|
||||||
catch (std::exception&)
|
catch (std::exception&)
|
||||||
{};
|
{};
|
||||||
|
@ -1425,7 +1426,7 @@ namespace libtorrent
|
||||||
|
|
||||||
boost::shared_ptr<stream_socket> s(new stream_socket(m_ses.m_io_service));
|
boost::shared_ptr<stream_socket> s(new stream_socket(m_ses.m_io_service));
|
||||||
boost::intrusive_ptr<peer_connection> c(new web_peer_connection(
|
boost::intrusive_ptr<peer_connection> c(new web_peer_connection(
|
||||||
m_ses, shared_from_this(), s, a, proxy, url));
|
m_ses, shared_from_this(), s, a, proxy, url, 0));
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
c->m_in_constructor = false;
|
c->m_in_constructor = false;
|
||||||
|
@ -1791,10 +1792,10 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
peer_connection& torrent::connect_to_peer(const tcp::endpoint& a)
|
peer_connection& torrent::connect_to_peer(policy::peer* peerinfo)
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
tcp::endpoint const& a(peerinfo->ip);
|
||||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||||
throw protocol_error(a.address().to_string() + " blocked by ip filter");
|
throw protocol_error(a.address().to_string() + " blocked by ip filter");
|
||||||
|
|
||||||
|
@ -1803,7 +1804,7 @@ namespace libtorrent
|
||||||
|
|
||||||
boost::shared_ptr<stream_socket> s(new stream_socket(m_ses.m_io_service));
|
boost::shared_ptr<stream_socket> s(new stream_socket(m_ses.m_io_service));
|
||||||
boost::intrusive_ptr<peer_connection> c(new bt_peer_connection(
|
boost::intrusive_ptr<peer_connection> c(new bt_peer_connection(
|
||||||
m_ses, shared_from_this(), s, a));
|
m_ses, shared_from_this(), s, a, peerinfo));
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
c->m_in_constructor = false;
|
c->m_in_constructor = false;
|
||||||
|
|
|
@ -626,7 +626,7 @@ namespace libtorrent
|
||||||
, bind(&torrent::save_path, _1));
|
, bind(&torrent::save_path, _1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void torrent_handle::connect_peer(tcp::endpoint const& adr) const
|
void torrent_handle::connect_peer(tcp::endpoint const& adr, int source) const
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
|
@ -650,7 +650,7 @@ namespace libtorrent
|
||||||
|
|
||||||
peer_id id;
|
peer_id id;
|
||||||
std::fill(id.begin(), id.end(), 0);
|
std::fill(id.begin(), id.end(), 0);
|
||||||
t->get_policy().peer_from_tracker(adr, id);
|
t->get_policy().peer_from_tracker(adr, id, source, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void torrent_handle::force_reannounce(
|
void torrent_handle::force_reannounce(
|
||||||
|
|
|
@ -217,7 +217,7 @@ namespace libtorrent { namespace
|
||||||
{
|
{
|
||||||
tcp::endpoint adr = detail::read_v4_endpoint<tcp::endpoint>(in);
|
tcp::endpoint adr = detail::read_v4_endpoint<tcp::endpoint>(in);
|
||||||
char flags = detail::read_uint8(fin);
|
char flags = detail::read_uint8(fin);
|
||||||
p.peer_from_tracker(adr, pid, flags);
|
p.peer_from_tracker(adr, pid, peer_info::pex, flags);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,8 +62,9 @@ namespace libtorrent
|
||||||
, boost::shared_ptr<stream_socket> s
|
, boost::shared_ptr<stream_socket> s
|
||||||
, tcp::endpoint const& remote
|
, tcp::endpoint const& remote
|
||||||
, tcp::endpoint const& proxy
|
, tcp::endpoint const& proxy
|
||||||
, std::string const& url)
|
, std::string const& url
|
||||||
: peer_connection(ses, t, s, remote, proxy)
|
, policy::peer* peerinfo)
|
||||||
|
: peer_connection(ses, t, s, remote, proxy, peerinfo)
|
||||||
, m_url(url)
|
, m_url(url)
|
||||||
, m_first_request(true)
|
, m_first_request(true)
|
||||||
{
|
{
|
||||||
|
@ -587,6 +588,7 @@ namespace libtorrent
|
||||||
|
|
||||||
p.client = m_server_string;
|
p.client = m_server_string;
|
||||||
p.connection_type = peer_info::web_seed;
|
p.connection_type = peer_info::web_seed;
|
||||||
|
p.source = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool web_peer_connection::in_handshake() const
|
bool web_peer_connection::in_handshake() const
|
||||||
|
|
Loading…
Reference in New Issue