forked from premiere/premiere-libtorrent
some cleanup, fixes, added documentation and added some configuration options.
This commit is contained in:
parent
4f6067a282
commit
0032bd8601
|
@ -572,6 +572,10 @@ in the torrent. Each boolean tells you if the peer has that piece (if it's set t
|
||||||
or if the peer miss that piece (set to false).
|
or if the peer miss that piece (set to false).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO: address
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>http_settings</h2>
|
<h2>http_settings</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
@ -590,11 +594,33 @@ struct http_settings
|
||||||
std::string proxy_login;
|
std::string proxy_login;
|
||||||
std::string proxy_password;
|
std::string proxy_password;
|
||||||
std::string user_agent;
|
std::string user_agent;
|
||||||
|
int tracker_timeout;
|
||||||
|
int tracker_maximum_response_length;
|
||||||
|
char fingerprint[4];
|
||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
TODO: address
|
<tt>tracker_timeout</tt> is the number of seconds the tracker connection will
|
||||||
|
wait until it considers the tracker to have timed-out. Default value is 30
|
||||||
|
seconds.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<tt>tracker_maximum_response_length</tt> is the maximum number of bytes in a
|
||||||
|
tracker response. If a response size passes this number it will be rejected
|
||||||
|
and the connection will be closed. On gzipped responses this size is measured
|
||||||
|
on the uncompressed data. So, if you get 20 bytes of gzip response that'll
|
||||||
|
expand to 2 megs, it will be interrupted before the entire response has been
|
||||||
|
uncompressed (given your limit is lower than 2 megs). Default limit is
|
||||||
|
1 megabyte.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<tt>fingerprint</tt> is a short string that will be used in the peer_id to
|
||||||
|
identify the client. If you want your fingerprint to be shorter than 4
|
||||||
|
characters, you can terminate the string with a null. The default is an
|
||||||
|
empty string.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a name="big_number"></a>big_number</h2>
|
<h2><a name="big_number"></a>big_number</h2>
|
||||||
|
|
|
@ -41,25 +41,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/http_settings.hpp"
|
#include "libtorrent/http_settings.hpp"
|
||||||
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
struct cout_logger: libtorrent::logger
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void log(const char* text) { std::cout << text; }
|
|
||||||
virtual void clear() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct cout_log_creator: libtorrent::log_spawner
|
|
||||||
{
|
|
||||||
virtual libtorrent::logger* create_logger(const char* title)
|
|
||||||
{
|
|
||||||
cout_logger* log = new cout_logger();
|
|
||||||
return log;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
@ -78,15 +59,14 @@ int main(int argc, char* argv[])
|
||||||
// settings.proxy_password = "foobar";
|
// settings.proxy_password = "foobar";
|
||||||
settings.user_agent = "example";
|
settings.user_agent = "example";
|
||||||
|
|
||||||
|
const char* fingerprint = "ex01";
|
||||||
|
std::copy(fingerprint, fingerprint+4, settings.fingerprint);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::vector<torrent_handle> handles;
|
std::vector<torrent_handle> handles;
|
||||||
#ifndef NDEBUG
|
|
||||||
cout_log_creator l;
|
|
||||||
session s(6881, &l);
|
|
||||||
#else
|
|
||||||
session s(6881);
|
session s(6881);
|
||||||
#endif
|
|
||||||
s.set_http_settings(settings);
|
s.set_http_settings(settings);
|
||||||
for (int i = 0; i < argc-1; ++i)
|
for (int i = 0; i < argc-1; ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,7 +40,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
// DEBUG API
|
// DEBUG API
|
||||||
|
|
||||||
struct logger
|
struct logger
|
||||||
|
@ -65,7 +65,6 @@ namespace libtorrent
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
logger& operator<<(char i)
|
logger& operator<<(char i)
|
||||||
{
|
{
|
||||||
char c[2];
|
char c[2];
|
||||||
|
@ -76,20 +75,25 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void log(const char*) = 0;
|
virtual void log(const char*) = 0;
|
||||||
virtual void clear() = 0;
|
|
||||||
virtual ~logger() {}
|
virtual ~logger() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// this is an abstract base for a log-window creator
|
struct cout_logger: libtorrent::logger
|
||||||
// this is called every time a new peer connects
|
|
||||||
// the logger that gets created will be deleted
|
|
||||||
// by the library when it's finished with it.
|
|
||||||
struct log_spawner
|
|
||||||
{
|
{
|
||||||
virtual logger* create_logger(const char* title) = 0;
|
public:
|
||||||
virtual ~log_spawner() {}
|
virtual void log(const char* text) { std::cout << text; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct file_logger: libtorrent::logger
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
file_logger(const char* filename)
|
||||||
|
: m_file(filename)
|
||||||
|
{}
|
||||||
|
virtual void log(const char* text) { m_file << text; }
|
||||||
|
|
||||||
|
std::ofstream m_file;
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,6 @@ namespace libtorrent
|
||||||
{ return piece == r.piece && start == r.start && length == r.length; }
|
{ return piece == r.piece && start == r.start && length == r.length; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: add checks to make sure we only get pieces we ask for
|
|
||||||
class peer_connection: public boost::noncopyable
|
class peer_connection: public boost::noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -146,7 +145,7 @@ namespace libtorrent
|
||||||
const peer_id& get_peer_id() const { return m_peer_id; }
|
const peer_id& get_peer_id() const { return m_peer_id; }
|
||||||
const std::vector<bool>& get_bitfield() const { return m_have_piece; }
|
const std::vector<bool>& get_bitfield() const { return m_have_piece; }
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
boost::shared_ptr<logger> m_logger;
|
boost::shared_ptr<logger> m_logger;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -115,16 +115,11 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
typedef std::map<boost::shared_ptr<socket>, boost::shared_ptr<peer_connection> > connection_map;
|
typedef std::map<boost::shared_ptr<socket>, boost::shared_ptr<peer_connection> > connection_map;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
session_impl()
|
||||||
session_impl(log_spawner* log_creator): m_abort(false)
|
: m_abort(false)
|
||||||
{
|
, m_tracker_manager(m_settings)
|
||||||
m_log_spawner = log_creator;
|
{}
|
||||||
}
|
|
||||||
#else
|
|
||||||
session_impl(): m_abort(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// must be locked to access the data
|
// must be locked to access the data
|
||||||
// in this struct
|
// in this struct
|
||||||
boost::mutex m_mutex;
|
boost::mutex m_mutex;
|
||||||
|
@ -146,14 +141,24 @@ namespace libtorrent
|
||||||
// them
|
// them
|
||||||
selector m_selector;
|
selector m_selector;
|
||||||
|
|
||||||
|
// the settings for the client
|
||||||
|
http_settings m_settings;
|
||||||
|
|
||||||
bool m_abort;
|
bool m_abort;
|
||||||
|
|
||||||
void run(int listen_port);
|
void run(int listen_port);
|
||||||
|
|
||||||
torrent* find_torrent(const sha1_hash& info_hash);
|
torrent* find_torrent(const sha1_hash& info_hash);
|
||||||
const peer_id& get_peer_id() const { return m_peer_id; }
|
const peer_id& get_peer_id() const { return m_peer_id; }
|
||||||
#ifndef NDEBUG
|
|
||||||
log_spawner* m_log_spawner;
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
|
boost::shared_ptr<logger> create_log(std::string name)
|
||||||
|
{
|
||||||
|
name += ".log";
|
||||||
|
// current options are file_logger and cout_logger
|
||||||
|
return boost::shared_ptr<logger>(new file_logger(name.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
boost::shared_ptr<logger> m_logger;
|
boost::shared_ptr<logger> m_logger;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -161,12 +166,12 @@ namespace libtorrent
|
||||||
struct main_loop_thread
|
struct main_loop_thread
|
||||||
{
|
{
|
||||||
main_loop_thread(int listen_port, session_impl* s)
|
main_loop_thread(int listen_port, session_impl* s)
|
||||||
: m_ses(s), m_listen_port(listen_port) {}
|
: m_ses(s), m_listen_port(listen_port)
|
||||||
|
{}
|
||||||
|
|
||||||
void operator()()
|
void operator()()
|
||||||
{
|
{ m_ses->run(m_listen_port); }
|
||||||
std::cout << "main thread started\n";
|
|
||||||
m_ses->run(m_listen_port);
|
|
||||||
}
|
|
||||||
session_impl* m_ses;
|
session_impl* m_ses;
|
||||||
int m_listen_port;
|
int m_listen_port;
|
||||||
};
|
};
|
||||||
|
@ -175,6 +180,8 @@ namespace libtorrent
|
||||||
|
|
||||||
struct http_settings;
|
struct http_settings;
|
||||||
|
|
||||||
|
std::string extract_fingerprint(const peer_id& p);
|
||||||
|
|
||||||
struct torrent_handle
|
struct torrent_handle
|
||||||
{
|
{
|
||||||
friend class session;
|
friend class session;
|
||||||
|
@ -208,16 +215,10 @@ namespace libtorrent
|
||||||
class session: public boost::noncopyable
|
class session: public boost::noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
#ifndef NDEBUG
|
|
||||||
session(int listen_port, log_spawner* new_log)
|
|
||||||
: m_impl(new_log)
|
|
||||||
, m_thread(detail::main_loop_thread(listen_port, &m_impl))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
session(int listen_port)
|
session(int listen_port)
|
||||||
: m_thread(detail::main_loop_thread(listen_port, &m_impl)) {}
|
: m_thread(detail::main_loop_thread(listen_port, &m_impl)) {}
|
||||||
#endif
|
|
||||||
~session();
|
~session();
|
||||||
|
|
||||||
// all torrent_handles must be destructed before the session is destructed!
|
// all torrent_handles must be destructed before the session is destructed!
|
||||||
|
|
|
@ -51,6 +51,8 @@ namespace libtorrent
|
||||||
, m_total_upload(0)
|
, m_total_upload(0)
|
||||||
, m_peak_downloaded_per_second(0)
|
, m_peak_downloaded_per_second(0)
|
||||||
, m_peak_uploaded_per_second(0)
|
, m_peak_uploaded_per_second(0)
|
||||||
|
, m_mean_download_per_second(0)
|
||||||
|
, m_mean_upload_per_second(0)
|
||||||
{
|
{
|
||||||
std::fill(m_download_per_second_history, m_download_per_second_history+history, 0);
|
std::fill(m_download_per_second_history, m_download_per_second_history+history, 0);
|
||||||
std::fill(m_upload_per_second_history, m_upload_per_second_history+history, 0);
|
std::fill(m_upload_per_second_history, m_upload_per_second_history+history, 0);
|
||||||
|
|
|
@ -90,9 +90,8 @@ libtorrent::peer_connection::peer_connection(detail::session_impl* ses, torrent*
|
||||||
{
|
{
|
||||||
assert(m_torrent != 0);
|
assert(m_torrent != 0);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
m_logger = boost::shared_ptr<logger>(
|
m_logger = m_ses->create_log(s->sender().as_string().c_str());
|
||||||
m_torrent->spawn_logger(s->sender().as_string().c_str()));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
send_handshake();
|
send_handshake();
|
||||||
|
@ -126,9 +125,8 @@ libtorrent::peer_connection::peer_connection(detail::session_impl* ses, boost::s
|
||||||
, m_choked(true)
|
, m_choked(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
m_logger = boost::shared_ptr<logger>(
|
m_logger = m_ses->create_log(s->sender().as_string().c_str());
|
||||||
m_ses->m_log_spawner->create_logger(s->sender().as_string().c_str()));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// we are not attached to any torrent yet.
|
// we are not attached to any torrent yet.
|
||||||
|
@ -159,7 +157,7 @@ void libtorrent::peer_connection::send_handshake()
|
||||||
std::copy(m_torrent->torrent_file().info_hash().begin(), m_torrent->torrent_file().info_hash().end(), m_send_buffer.begin() + 28);
|
std::copy(m_torrent->torrent_file().info_hash().begin(), m_torrent->torrent_file().info_hash().end(), m_send_buffer.begin() + 28);
|
||||||
std::copy(m_ses->get_peer_id().begin(), m_ses->get_peer_id().end(), m_send_buffer.begin() + 48);
|
std::copy(m_ses->get_peer_id().begin(), m_ses->get_peer_id().end(), m_send_buffer.begin() + 48);
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> HANDSHAKE\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> HANDSHAKE\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -176,7 +174,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
// *************** CHOKE ***************
|
// *************** CHOKE ***************
|
||||||
case msg_choke:
|
case msg_choke:
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== CHOKE\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== CHOKE\n";
|
||||||
#endif
|
#endif
|
||||||
m_peer_choked = true;
|
m_peer_choked = true;
|
||||||
|
@ -200,7 +198,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
// *************** UNCHOKE ***************
|
// *************** UNCHOKE ***************
|
||||||
case msg_unchoke:
|
case msg_unchoke:
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== UNCHOKE\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== UNCHOKE\n";
|
||||||
#endif
|
#endif
|
||||||
m_peer_choked = false;
|
m_peer_choked = false;
|
||||||
|
@ -210,7 +208,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
// *************** INTERESTED ***************
|
// *************** INTERESTED ***************
|
||||||
case msg_interested:
|
case msg_interested:
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== INTERESTED\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== INTERESTED\n";
|
||||||
#endif
|
#endif
|
||||||
m_peer_interested = true;
|
m_peer_interested = true;
|
||||||
|
@ -220,7 +218,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
// *************** NOT INTERESTED ***************
|
// *************** NOT INTERESTED ***************
|
||||||
case msg_not_interested:
|
case msg_not_interested:
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== NOT_INTERESTED\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== NOT_INTERESTED\n";
|
||||||
#endif
|
#endif
|
||||||
m_peer_interested = false;
|
m_peer_interested = false;
|
||||||
|
@ -237,13 +235,13 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
if (index >= m_have_piece.size())
|
if (index >= m_have_piece.size())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== HAVE [ piece: " << index << "]\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== HAVE [ piece: " << index << "]\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (m_have_piece[index])
|
if (m_have_piece[index])
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " oops.. we already knew that: " << index << "\n";
|
(*m_logger) << m_socket->sender().as_string() << " oops.. we already knew that: " << index << "\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -265,7 +263,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
if (m_packet_size - 1 != (m_have_piece.size() + 7) / 8)
|
if (m_packet_size - 1 != (m_have_piece.size() + 7) / 8)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== BITFIELD\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== BITFIELD\n";
|
||||||
#endif
|
#endif
|
||||||
bool interesting = false;
|
bool interesting = false;
|
||||||
|
@ -287,7 +285,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
}
|
}
|
||||||
if (is_seed)
|
if (is_seed)
|
||||||
{
|
{
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " *** THIS IS A SEED ***\n";
|
(*m_logger) << m_socket->sender().as_string() << " *** THIS IS A SEED ***\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -307,7 +305,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
r.length = read_int(&m_recv_buffer[9]);
|
r.length = read_int(&m_recv_buffer[9]);
|
||||||
m_requests.push_back(r);
|
m_requests.push_back(r);
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== REQUEST [ piece: " << r.piece << " | s: " << r.start << " | l: " << r.length << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== REQUEST [ piece: " << r.piece << " | s: " << r.start << " | l: " << r.length << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -322,7 +320,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
std::size_t index = read_int(&m_recv_buffer[1]);
|
std::size_t index = read_int(&m_recv_buffer[1]);
|
||||||
if (index < 0 || index >= m_torrent->torrent_file().num_pieces())
|
if (index < 0 || index >= m_torrent->torrent_file().num_pieces())
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " piece index invalid\n";
|
(*m_logger) << m_socket->sender().as_string() << " piece index invalid\n";
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
@ -332,7 +330,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
if (offset < 0)
|
if (offset < 0)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " offset < 0\n";
|
(*m_logger) << m_socket->sender().as_string() << " offset < 0\n";
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
@ -340,7 +338,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
if (offset + len > m_torrent->torrent_file().piece_size(index))
|
if (offset + len > m_torrent->torrent_file().piece_size(index))
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " piece packet contains more data than the piece size\n";
|
(*m_logger) << m_socket->sender().as_string() << " piece packet contains more data than the piece size\n";
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
@ -348,7 +346,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
if (offset % m_torrent->block_size() != 0)
|
if (offset % m_torrent->block_size() != 0)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " piece packet contains unaligned offset\n";
|
(*m_logger) << m_socket->sender().as_string() << " piece packet contains unaligned offset\n";
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
@ -357,7 +355,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
piece_block req = m_download_queue.front();
|
piece_block req = m_download_queue.front();
|
||||||
if (req.piece_index != index)
|
if (req.piece_index != index)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " piece packet contains unrequested index\n";
|
(*m_logger) << m_socket->sender().as_string() << " piece packet contains unrequested index\n";
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
@ -365,7 +363,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
|
|
||||||
if (req.block_index != offset / m_torrent->block_size())
|
if (req.block_index != offset / m_torrent->block_size())
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " piece packet contains unrequested offset\n";
|
(*m_logger) << m_socket->sender().as_string() << " piece packet contains unrequested offset\n";
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
@ -376,7 +374,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
m_receiving_piece.open(m_torrent->filesystem(), index, piece_file::out);
|
m_receiving_piece.open(m_torrent->filesystem(), index, piece_file::out);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== PIECE [ piece: " << index << " | s: " << offset << " | l: " << len << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== PIECE [ piece: " << index << " | s: " << offset << " | l: " << len << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -432,7 +430,7 @@ bool libtorrent::peer_connection::dispatch_message()
|
||||||
m_requests.erase(i);
|
m_requests.erase(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " <== CANCEL [ piece: " << r.piece << " | s: " << r.start << " | l: " << r.length << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " <== CANCEL [ piece: " << r.piece << " | s: " << r.start << " | l: " << r.length << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
m_requests.clear();
|
m_requests.clear();
|
||||||
|
@ -482,8 +480,8 @@ void libtorrent::peer_connection::request_block(piece_block block)
|
||||||
// length
|
// length
|
||||||
write_int(block_size, &m_send_buffer[start_offset]);
|
write_int(block_size, &m_send_buffer[start_offset]);
|
||||||
start_offset += 4;
|
start_offset += 4;
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> REQUEST [ piece: " << block.piece_index << " | s: " << block_offset << " | l: " << block_size << " | " << block.block_index << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> REQUEST [ piece: " << block.piece_index << " | s: " << block_offset << " | l: " << block_size << " | " << block.block_index << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
assert(start_offset == m_send_buffer.size());
|
assert(start_offset == m_send_buffer.size());
|
||||||
|
|
||||||
|
@ -491,7 +489,7 @@ void libtorrent::peer_connection::request_block(piece_block block)
|
||||||
|
|
||||||
void libtorrent::peer_connection::send_bitfield()
|
void libtorrent::peer_connection::send_bitfield()
|
||||||
{
|
{
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> BITFIELD\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> BITFIELD\n";
|
||||||
#endif
|
#endif
|
||||||
const int packet_size = (m_have_piece.size() + 7) / 8 + 5;
|
const int packet_size = (m_have_piece.size() + 7) / 8 + 5;
|
||||||
|
@ -513,7 +511,7 @@ void libtorrent::peer_connection::choke()
|
||||||
char msg[] = {0,0,0,1,msg_choke};
|
char msg[] = {0,0,0,1,msg_choke};
|
||||||
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
||||||
m_choked = true;
|
m_choked = true;
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> CHOKE\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> CHOKE\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -524,7 +522,7 @@ void libtorrent::peer_connection::unchoke()
|
||||||
char msg[] = {0,0,0,1,msg_unchoke};
|
char msg[] = {0,0,0,1,msg_unchoke};
|
||||||
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
||||||
m_choked = false;
|
m_choked = false;
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> UNCHOKE\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> UNCHOKE\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -535,7 +533,7 @@ void libtorrent::peer_connection::interested()
|
||||||
char msg[] = {0,0,0,1,msg_interested};
|
char msg[] = {0,0,0,1,msg_interested};
|
||||||
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
||||||
m_interesting = true;
|
m_interesting = true;
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> INTERESTED\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> INTERESTED\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -546,7 +544,7 @@ void libtorrent::peer_connection::not_interested()
|
||||||
char msg[] = {0,0,0,1,msg_not_interested};
|
char msg[] = {0,0,0,1,msg_not_interested};
|
||||||
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
m_send_buffer.insert(m_send_buffer.end(), msg, msg+sizeof(msg));
|
||||||
m_interesting = false;
|
m_interesting = false;
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> NOT_INTERESTED\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> NOT_INTERESTED\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -556,7 +554,7 @@ void libtorrent::peer_connection::send_have(int index)
|
||||||
char msg[9] = {0,0,0,5,msg_have};
|
char msg[9] = {0,0,0,5,msg_have};
|
||||||
write_int(index, msg+5);
|
write_int(index, msg+5);
|
||||||
m_send_buffer.insert(m_send_buffer.end(), msg, msg+9);
|
m_send_buffer.insert(m_send_buffer.end(), msg, msg+9);
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> HAVE [ piece: " << index << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> HAVE [ piece: " << index << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -594,7 +592,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
{
|
{
|
||||||
case read_protocol_length:
|
case read_protocol_length:
|
||||||
m_packet_size = reinterpret_cast<unsigned char&>(m_recv_buffer[0]);
|
m_packet_size = reinterpret_cast<unsigned char&>(m_recv_buffer[0]);
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " protocol length: " << m_packet_size << "\n";
|
(*m_logger) << m_socket->sender().as_string() << " protocol length: " << m_packet_size << "\n";
|
||||||
#endif
|
#endif
|
||||||
m_state = read_protocol_version;
|
m_state = read_protocol_version;
|
||||||
|
@ -608,7 +606,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
case read_protocol_version:
|
case read_protocol_version:
|
||||||
{
|
{
|
||||||
const char* protocol_version = "BitTorrent protocol";
|
const char* protocol_version = "BitTorrent protocol";
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " protocol name: " << std::string(m_recv_buffer.begin(), m_recv_buffer.end()) << "\n";
|
(*m_logger) << m_socket->sender().as_string() << " protocol name: " << std::string(m_recv_buffer.begin(), m_recv_buffer.end()) << "\n";
|
||||||
#endif
|
#endif
|
||||||
if (!std::equal(m_recv_buffer.begin(), m_recv_buffer.end(), protocol_version))
|
if (!std::equal(m_recv_buffer.begin(), m_recv_buffer.end(), protocol_version))
|
||||||
|
@ -640,7 +638,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
if (m_torrent == 0)
|
if (m_torrent == 0)
|
||||||
{
|
{
|
||||||
// we couldn't find the torrent!
|
// we couldn't find the torrent!
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " couldn't find a torrent with the given info_hash\n";
|
(*m_logger) << m_socket->sender().as_string() << " couldn't find a torrent with the given info_hash\n";
|
||||||
#endif
|
#endif
|
||||||
throw network_error(0);
|
throw network_error(0);
|
||||||
|
@ -662,7 +660,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
// verify info hash
|
// verify info hash
|
||||||
if (!std::equal(m_recv_buffer.begin()+8, m_recv_buffer.begin() + 28, (const char*)m_torrent->torrent_file().info_hash().begin()))
|
if (!std::equal(m_recv_buffer.begin()+8, m_recv_buffer.begin() + 28, (const char*)m_torrent->torrent_file().info_hash().begin()))
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " received invalid info_hash\n";
|
(*m_logger) << m_socket->sender().as_string() << " received invalid info_hash\n";
|
||||||
#endif
|
#endif
|
||||||
throw network_error(0);
|
throw network_error(0);
|
||||||
|
@ -673,7 +671,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
m_packet_size = 20;
|
m_packet_size = 20;
|
||||||
m_recv_pos = 0;
|
m_recv_pos = 0;
|
||||||
m_recv_buffer.resize(20);
|
m_recv_buffer.resize(20);
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " info_hash received\n";
|
(*m_logger) << m_socket->sender().as_string() << " info_hash received\n";
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
@ -689,7 +687,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
// can this be correct?
|
// can this be correct?
|
||||||
if (!std::equal(m_recv_buffer.begin(), m_recv_buffer.begin() + 20, (const char*)m_peer_id.begin()))
|
if (!std::equal(m_recv_buffer.begin(), m_recv_buffer.begin() + 20, (const char*)m_peer_id.begin()))
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " invalid peer_id (it doesn't equal the one from the tracker)\n";
|
(*m_logger) << m_socket->sender().as_string() << " invalid peer_id (it doesn't equal the one from the tracker)\n";
|
||||||
#endif
|
#endif
|
||||||
throw network_error(0);
|
throw network_error(0);
|
||||||
|
@ -702,7 +700,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
std::copy(m_recv_buffer.begin(), m_recv_buffer.begin() + 20, (char*)m_peer_id.begin());
|
std::copy(m_recv_buffer.begin(), m_recv_buffer.begin() + 20, (char*)m_peer_id.begin());
|
||||||
if (m_torrent->num_connections(m_peer_id) > 1)
|
if (m_torrent->num_connections(m_peer_id) > 1)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " duplicate connection, closing\n";
|
(*m_logger) << m_socket->sender().as_string() << " duplicate connection, closing\n";
|
||||||
#endif
|
#endif
|
||||||
throw network_error(0);
|
throw network_error(0);
|
||||||
|
@ -713,7 +711,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
m_packet_size = 4;
|
m_packet_size = 4;
|
||||||
m_recv_pos = 0;
|
m_recv_pos = 0;
|
||||||
m_recv_buffer.resize(4);
|
m_recv_buffer.resize(4);
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " received peer_id\n";
|
(*m_logger) << m_socket->sender().as_string() << " received peer_id\n";
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
@ -726,7 +724,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
// don't accept packets larger than 1 MB
|
// don't accept packets larger than 1 MB
|
||||||
if (m_packet_size > 1024*1024 || m_packet_size < 0)
|
if (m_packet_size > 1024*1024 || m_packet_size < 0)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " packet too large (packet_size > 1 Megabyte), abort\n";
|
(*m_logger) << m_socket->sender().as_string() << " packet too large (packet_size > 1 Megabyte), abort\n";
|
||||||
#endif
|
#endif
|
||||||
// packet too large
|
// packet too large
|
||||||
|
@ -750,7 +748,7 @@ void libtorrent::peer_connection::receive_data()
|
||||||
case read_packet:
|
case read_packet:
|
||||||
if (!dispatch_message())
|
if (!dispatch_message())
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " received invalid packet\n";
|
(*m_logger) << m_socket->sender().as_string() << " received invalid packet\n";
|
||||||
#endif
|
#endif
|
||||||
// invalid message
|
// invalid message
|
||||||
|
@ -825,7 +823,7 @@ void libtorrent::peer_connection::send_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sending_piece.read(&m_send_buffer[13], r.length);
|
m_sending_piece.read(&m_send_buffer[13], r.length);
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> PIECE [ idx: " << r.piece << " | s: " << r.start << " | l: " << r.length << " | dest: " << m_socket->sender().as_string() << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> PIECE [ idx: " << r.piece << " | s: " << r.start << " | l: " << r.length << " | dest: " << m_socket->sender().as_string() << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
// let the torrent keep track of how much we have uploaded
|
// let the torrent keep track of how much we have uploaded
|
||||||
|
@ -834,7 +832,7 @@ void libtorrent::peer_connection::send_data()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " *** WARNING [ illegal piece request ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " *** WARNING [ illegal piece request ]\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -856,7 +854,7 @@ void libtorrent::peer_connection::send_data()
|
||||||
// we have data that's scheduled for sending
|
// we have data that's scheduled for sending
|
||||||
std::size_t sent = m_socket->send(&m_send_buffer[0], m_send_buffer.size());
|
std::size_t sent = m_socket->send(&m_send_buffer[0], m_send_buffer.size());
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> SENT [ length: " << sent << " ]\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> SENT [ length: " << sent << " ]\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -888,7 +886,7 @@ void libtorrent::peer_connection::keep_alive()
|
||||||
char noop[] = {0,0,0,0};
|
char noop[] = {0,0,0,0};
|
||||||
m_send_buffer.insert(m_send_buffer.end(), noop, noop+4);
|
m_send_buffer.insert(m_send_buffer.end(), noop, noop+4);
|
||||||
m_last_sent = boost::posix_time::second_clock::local_time();
|
m_last_sent = boost::posix_time::second_clock::local_time();
|
||||||
#if !defined(NDEBUG) && defined(VERBOSE)
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << m_socket->sender().as_string() << " ==> NOP\n";
|
(*m_logger) << m_socket->sender().as_string() << " ==> NOP\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/filesystem/convenience.hpp>
|
#include <boost/filesystem/convenience.hpp>
|
||||||
|
@ -53,6 +54,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
using ::srand;
|
using ::srand;
|
||||||
|
using ::isprint;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -78,16 +80,30 @@ namespace
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
|
||||||
peer_id generate_peer_id()
|
peer_id generate_peer_id(const http_settings& s)
|
||||||
{
|
{
|
||||||
peer_id ret;
|
peer_id ret;
|
||||||
std::srand(std::time(0));
|
std::srand(std::time(0));
|
||||||
// TODO: add ability to control fingerprint
|
|
||||||
unsigned char fingerprint[] = "lt.\0\0\0\0\0\0\0";
|
// libtorrent's fingerprint
|
||||||
// unsigned char fingerprint[] = "lt.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
|
unsigned char fingerprint[] = "lt.";
|
||||||
const int len = sizeof(fingerprint)-1;
|
const int len = sizeof(fingerprint)-1-(s.fingerprint[0] == 0)?1:0;
|
||||||
std::copy(fingerprint, fingerprint+len, ret.begin());
|
std::copy(fingerprint, fingerprint+len, ret.begin());
|
||||||
for (unsigned char* i = ret.begin()+len; i != ret.end(); ++i) *i = rand();
|
|
||||||
|
// the client's fingerprint
|
||||||
|
const int len2 = std::find(s.fingerprint, s.fingerprint+4, 0) - s.fingerprint;
|
||||||
|
std::copy(s.fingerprint, s.fingerprint+len2, ret.begin()+len);
|
||||||
|
|
||||||
|
// the zeros
|
||||||
|
std::fill(ret.begin()+len+len2, ret.begin()+len+len2+3, 0);
|
||||||
|
|
||||||
|
// the random number
|
||||||
|
for (unsigned char* i = ret.begin()+len+len2+3;
|
||||||
|
i != ret.end();
|
||||||
|
++i)
|
||||||
|
{
|
||||||
|
*i = rand();
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,12 +115,11 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
void session_impl::run(int listen_port)
|
void session_impl::run(int listen_port)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
m_logger = boost::shared_ptr<logger>(
|
m_logger = create_log("main session");
|
||||||
m_log_spawner->create_logger("main session"));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_peer_id = generate_peer_id();
|
m_peer_id = generate_peer_id(m_settings);
|
||||||
|
|
||||||
boost::shared_ptr<socket> listener(new socket(socket::tcp, false));
|
boost::shared_ptr<socket> listener(new socket(socket::tcp, false));
|
||||||
int max_port = listen_port + 9;
|
int max_port = listen_port + 9;
|
||||||
|
@ -127,7 +142,9 @@ namespace libtorrent
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "listening on port: " << listen_port << "\n";
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
|
(*m_logger) << "listening on port: " << listen_port << "\n";
|
||||||
|
#endif
|
||||||
m_selector.monitor_readability(listener);
|
m_selector.monitor_readability(listener);
|
||||||
m_selector.monitor_errors(listener);
|
m_selector.monitor_errors(listener);
|
||||||
|
|
||||||
|
@ -194,7 +211,7 @@ namespace libtorrent
|
||||||
if (s)
|
if (s)
|
||||||
{
|
{
|
||||||
// we got a connection request!
|
// we got a connection request!
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << s->sender().as_string() << " <== INCOMING CONNECTION\n";
|
(*m_logger) << s->sender().as_string() << " <== INCOMING CONNECTION\n";
|
||||||
#endif
|
#endif
|
||||||
// TODO: the send buffer size should be controllable from the outside
|
// TODO: the send buffer size should be controllable from the outside
|
||||||
|
@ -364,7 +381,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
m_tracker_manager.tick();
|
m_tracker_manager.tick();
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||||
(*m_logger) << "peers: " << m_connections.size() << " \n";
|
(*m_logger) << "peers: " << m_connections.size() << " \n";
|
||||||
for (connection_map::iterator i = m_connections.begin();
|
for (connection_map::iterator i = m_connections.begin();
|
||||||
i != m_connections.end();
|
i != m_connections.end();
|
||||||
|
@ -375,19 +392,6 @@ namespace libtorrent
|
||||||
<< " b/s | up: " << i->second->statistics().upload_rate()
|
<< " b/s | up: " << i->second->statistics().upload_rate()
|
||||||
<< " b/s \n";
|
<< " b/s \n";
|
||||||
}
|
}
|
||||||
|
|
||||||
m_logger->clear();
|
|
||||||
#else
|
|
||||||
std::cout << "peers: " << m_connections.size() << " \n";
|
|
||||||
for (connection_map::iterator i = m_connections.begin();
|
|
||||||
i != m_connections.end();
|
|
||||||
++i)
|
|
||||||
{
|
|
||||||
std::cout << "h: " << i->first->sender().as_string()
|
|
||||||
<< " | down: " << i->second->statistics().download_rate()
|
|
||||||
<< " b/s | up: " << i->second->statistics().upload_rate()
|
|
||||||
<< " b/s \n";
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +478,7 @@ namespace libtorrent
|
||||||
void session::set_http_settings(const http_settings& s)
|
void session::set_http_settings(const http_settings& s)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock l(m_impl.m_mutex);
|
boost::mutex::scoped_lock l(m_impl.m_mutex);
|
||||||
m_impl.m_tracker_manager.set_settings(s);
|
m_impl.m_settings = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
session::~session()
|
session::~session()
|
||||||
|
@ -544,4 +548,19 @@ namespace libtorrent
|
||||||
m_ses = 0;
|
m_ses = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: document
|
||||||
|
std::string extract_fingerprint(const peer_id& p)
|
||||||
|
{
|
||||||
|
std::string ret;
|
||||||
|
const unsigned char* c = p.begin();
|
||||||
|
while (c != p.end() && *c != 0)
|
||||||
|
{
|
||||||
|
if (!std::isprint(*c)) return std::string();
|
||||||
|
ret += *c;
|
||||||
|
++c;
|
||||||
|
}
|
||||||
|
if (c == p.end()) return std::string();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,7 +184,7 @@ namespace libtorrent
|
||||||
std::cout << std::hex << std::setw(2) << std::setfill('0')
|
std::cout << std::hex << std::setw(2) << std::setfill('0')
|
||||||
<< static_cast<unsigned int>(*j);
|
<< static_cast<unsigned int>(*j);
|
||||||
}
|
}
|
||||||
std::cout << "\n";
|
std::cout << " " << extract_fingerprint(i->id) << "\n";
|
||||||
}
|
}
|
||||||
std::cout << std::dec << std::setfill(' ');
|
std::cout << std::dec << std::setfill(' ');
|
||||||
|
|
||||||
|
@ -355,13 +355,6 @@ namespace libtorrent
|
||||||
std::cout << "connecting to: " << a.as_string() << ":" << a.port() << "\n";
|
std::cout << "connecting to: " << a.as_string() << ":" << a.port() << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
logger* torrent::spawn_logger(const char* title)
|
|
||||||
{
|
|
||||||
return m_ses->m_log_spawner->create_logger(title);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void torrent::close_all_connections()
|
void torrent::close_all_connections()
|
||||||
{
|
{
|
||||||
for (detail::session_impl::connection_map::iterator i = m_ses->m_connections.begin();
|
for (detail::session_impl::connection_map::iterator i = m_ses->m_connections.begin();
|
||||||
|
|
Loading…
Reference in New Issue