mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-02 22:48:40 +00:00
lt sync 1688
This commit is contained in:
parent
2e5eb2b885
commit
5d4a69d852
15 changed files with 135 additions and 90 deletions
|
@ -159,7 +159,7 @@ namespace libtorrent
|
||||||
asio::strand& m_strand;
|
asio::strand& m_strand;
|
||||||
tcp::resolver m_name_lookup;
|
tcp::resolver m_name_lookup;
|
||||||
int m_port;
|
int m_port;
|
||||||
boost::shared_ptr<socket_type> m_socket;
|
socket_type m_socket;
|
||||||
int m_recv_pos;
|
int m_recv_pos;
|
||||||
std::vector<char> m_buffer;
|
std::vector<char> m_buffer;
|
||||||
std::string m_send_buffer;
|
std::string m_send_buffer;
|
||||||
|
|
|
@ -41,8 +41,8 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
struct proxy_settings;
|
struct proxy_settings;
|
||||||
|
|
||||||
boost::shared_ptr<socket_type> instantiate_connection(
|
bool instantiate_connection(asio::io_service& ios
|
||||||
asio::io_service& ios, proxy_settings const& ps);
|
, proxy_settings const& ps, socket_type& s);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -104,10 +104,9 @@ public:
|
||||||
m_sock.bind(endpoint);
|
m_sock.bind(endpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Error_Handler>
|
void bind(endpoint_type const& endpoint, asio::error_code& ec)
|
||||||
void bind(endpoint_type const& endpoint, Error_Handler const& error_handler)
|
|
||||||
{
|
{
|
||||||
m_sock.bind(endpoint, error_handler);
|
m_sock.bind(endpoint, ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void open(protocol_type const& p)
|
void open(protocol_type const& p)
|
||||||
|
@ -115,10 +114,9 @@ public:
|
||||||
m_sock.open(p);
|
m_sock.open(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Error_Handler>
|
void open(protocol_type const& p, asio::error_code& ec)
|
||||||
void open(protocol_type const& p, Error_Handler const& error_handler)
|
|
||||||
{
|
{
|
||||||
m_sock.open(p, error_handler);
|
m_sock.open(p, ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void close()
|
void close()
|
||||||
|
@ -127,10 +125,9 @@ public:
|
||||||
m_sock.close();
|
m_sock.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Error_Handler>
|
void close(asio::error_code& ec)
|
||||||
void close(Error_Handler const& error_handler)
|
|
||||||
{
|
{
|
||||||
m_sock.close(error_handler);
|
m_sock.close(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
endpoint_type remote_endpoint()
|
endpoint_type remote_endpoint()
|
||||||
|
@ -138,8 +135,7 @@ public:
|
||||||
return m_remote_endpoint;
|
return m_remote_endpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Error_Handler>
|
endpoint_type remote_endpoint(asio::error_code& ec)
|
||||||
endpoint_type remote_endpoint(Error_Handler const& error_handler)
|
|
||||||
{
|
{
|
||||||
return m_remote_endpoint;
|
return m_remote_endpoint;
|
||||||
}
|
}
|
||||||
|
@ -149,10 +145,9 @@ public:
|
||||||
return m_sock.local_endpoint();
|
return m_sock.local_endpoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Error_Handler>
|
endpoint_type local_endpoint(asio::error_code& ec)
|
||||||
endpoint_type local_endpoint(Error_Handler const& error_handler)
|
|
||||||
{
|
{
|
||||||
return m_sock.local_endpoint(error_handler);
|
return m_sock.local_endpoint(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
asio::io_service& io_service()
|
asio::io_service& io_service()
|
||||||
|
@ -168,7 +163,6 @@ public:
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
stream_socket m_sock;
|
stream_socket m_sock;
|
||||||
// the socks5 proxy
|
|
||||||
std::string m_hostname;
|
std::string m_hostname;
|
||||||
int m_port;
|
int m_port;
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ namespace libtorrent
|
||||||
, tracker_receive_timeout(20)
|
, tracker_receive_timeout(20)
|
||||||
, stop_tracker_timeout(5)
|
, stop_tracker_timeout(5)
|
||||||
, tracker_maximum_response_length(1024*1024)
|
, tracker_maximum_response_length(1024*1024)
|
||||||
, piece_timeout(120)
|
, piece_timeout(10)
|
||||||
, request_queue_time(3.f)
|
, request_queue_time(3.f)
|
||||||
, max_allowed_in_request_queue(250)
|
, max_allowed_in_request_queue(250)
|
||||||
, max_out_request_queue(200)
|
, max_out_request_queue(200)
|
||||||
|
|
|
@ -89,3 +89,4 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -101,3 +101,4 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -424,6 +424,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
int block_size() const { TORRENT_ASSERT(m_block_size > 0); return m_block_size; }
|
int block_size() const { TORRENT_ASSERT(m_block_size > 0); return m_block_size; }
|
||||||
|
peer_request to_req(piece_block const& p);
|
||||||
|
|
||||||
// this will tell all peers that we just got his piece
|
// this will tell all peers that we just got his piece
|
||||||
// and also let the piece picker know that we have this piece
|
// and also let the piece picker know that we have this piece
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace libtorrent
|
||||||
|
|
||||||
asio::strand& m_strand;
|
asio::strand& m_strand;
|
||||||
udp::resolver m_name_lookup;
|
udp::resolver m_name_lookup;
|
||||||
boost::shared_ptr<datagram_socket> m_socket;
|
datagram_socket m_socket;
|
||||||
udp::endpoint m_target;
|
udp::endpoint m_target;
|
||||||
udp::endpoint m_sender;
|
udp::endpoint m_sender;
|
||||||
|
|
||||||
|
|
|
@ -501,15 +501,12 @@ public:
|
||||||
typedef typename S0::endpoint_type endpoint_type;
|
typedef typename S0::endpoint_type endpoint_type;
|
||||||
typedef typename S0::protocol_type protocol_type;
|
typedef typename S0::protocol_type protocol_type;
|
||||||
|
|
||||||
explicit variant_stream(asio::io_service& io_service)
|
explicit variant_stream() : m_variant(boost::blank()) {}
|
||||||
: m_io_service(io_service)
|
|
||||||
, m_variant(boost::blank())
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <class S>
|
template <class S>
|
||||||
void instantiate()
|
void instantiate(asio::io_service& ios)
|
||||||
{
|
{
|
||||||
std::auto_ptr<S> owned(new S(m_io_service));
|
std::auto_ptr<S> owned(new S(ios));
|
||||||
boost::apply_visitor(aux::delete_visitor(), m_variant);
|
boost::apply_visitor(aux::delete_visitor(), m_variant);
|
||||||
m_variant = owned.get();
|
m_variant = owned.get();
|
||||||
owned.release();
|
owned.release();
|
||||||
|
@ -704,7 +701,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
asio::io_service& m_io_service;
|
|
||||||
variant_type m_variant;
|
variant_type m_variant;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -496,7 +496,7 @@ namespace libtorrent
|
||||||
void http_tracker_connection::on_timeout()
|
void http_tracker_connection::on_timeout()
|
||||||
{
|
{
|
||||||
m_timed_out = true;
|
m_timed_out = true;
|
||||||
m_socket.reset();
|
m_socket.close();
|
||||||
m_name_lookup.cancel();
|
m_name_lookup.cancel();
|
||||||
if (m_connection_ticket > -1) m_cc.done(m_connection_ticket);
|
if (m_connection_ticket > -1) m_cc.done(m_connection_ticket);
|
||||||
m_connection_ticket = -1;
|
m_connection_ticket = -1;
|
||||||
|
@ -550,18 +550,20 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cb) cb->m_tracker_address = target_address;
|
if (cb) cb->m_tracker_address = target_address;
|
||||||
m_socket = instantiate_connection(m_name_lookup.io_service(), m_proxy);
|
bool ret = instantiate_connection(m_strand.io_service(), m_proxy, m_socket);
|
||||||
|
|
||||||
|
TORRENT_ASSERT(ret);
|
||||||
|
|
||||||
if (m_proxy.type == proxy_settings::http
|
if (m_proxy.type == proxy_settings::http
|
||||||
|| m_proxy.type == proxy_settings::http_pw)
|
|| m_proxy.type == proxy_settings::http_pw)
|
||||||
{
|
{
|
||||||
// the tracker connection will talk immediately to
|
// the tracker connection will talk immediately to
|
||||||
// the proxy, without requiring CONNECT support
|
// the proxy, without requiring CONNECT support
|
||||||
m_socket->get<http_stream>().set_no_connect(true);
|
m_socket.get<http_stream>().set_no_connect(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_socket->open(target_address.protocol());
|
m_socket.open(target_address.protocol());
|
||||||
m_socket->bind(tcp::endpoint(bind_interface(), 0));
|
m_socket.bind(tcp::endpoint(bind_interface(), 0));
|
||||||
m_cc.enqueue(bind(&http_tracker_connection::connect, self(), _1, target_address)
|
m_cc.enqueue(bind(&http_tracker_connection::connect, self(), _1, target_address)
|
||||||
, bind(&http_tracker_connection::on_timeout, self())
|
, bind(&http_tracker_connection::on_timeout, self())
|
||||||
, seconds(m_settings.tracker_receive_timeout));
|
, seconds(m_settings.tracker_receive_timeout));
|
||||||
|
@ -574,7 +576,7 @@ namespace libtorrent
|
||||||
void http_tracker_connection::connect(int ticket, tcp::endpoint target_address)
|
void http_tracker_connection::connect(int ticket, tcp::endpoint target_address)
|
||||||
{
|
{
|
||||||
m_connection_ticket = ticket;
|
m_connection_ticket = ticket;
|
||||||
m_socket->async_connect(target_address, bind(&http_tracker_connection::connected, self(), _1));
|
m_socket.async_connect(target_address, bind(&http_tracker_connection::connected, self(), _1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void http_tracker_connection::connected(asio::error_code const& error) try
|
void http_tracker_connection::connected(asio::error_code const& error) try
|
||||||
|
@ -595,7 +597,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
restart_read_timeout();
|
restart_read_timeout();
|
||||||
async_write(*m_socket, asio::buffer(m_send_buffer.c_str()
|
async_write(m_socket, asio::buffer(m_send_buffer.c_str()
|
||||||
, m_send_buffer.size()), bind(&http_tracker_connection::sent
|
, m_send_buffer.size()), bind(&http_tracker_connection::sent
|
||||||
, self(), _1));
|
, self(), _1));
|
||||||
}
|
}
|
||||||
|
@ -620,7 +622,7 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
restart_read_timeout();
|
restart_read_timeout();
|
||||||
TORRENT_ASSERT(m_buffer.size() - m_recv_pos > 0);
|
TORRENT_ASSERT(m_buffer.size() - m_recv_pos > 0);
|
||||||
m_socket->async_read_some(asio::buffer(&m_buffer[m_recv_pos]
|
m_socket.async_read_some(asio::buffer(&m_buffer[m_recv_pos]
|
||||||
, m_buffer.size() - m_recv_pos), bind(&http_tracker_connection::receive
|
, m_buffer.size() - m_recv_pos), bind(&http_tracker_connection::receive
|
||||||
, self(), _1, _2));
|
, self(), _1, _2));
|
||||||
}
|
}
|
||||||
|
@ -701,7 +703,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(m_buffer.size() - m_recv_pos > 0);
|
TORRENT_ASSERT(m_buffer.size() - m_recv_pos > 0);
|
||||||
m_socket->async_read_some(asio::buffer(&m_buffer[m_recv_pos]
|
m_socket.async_read_some(asio::buffer(&m_buffer[m_recv_pos]
|
||||||
, m_buffer.size() - m_recv_pos), bind(&http_tracker_connection::receive
|
, m_buffer.size() - m_recv_pos), bind(&http_tracker_connection::receive
|
||||||
, self(), _1, _2));
|
, self(), _1, _2));
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,42 +42,40 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
boost::shared_ptr<socket_type> instantiate_connection(
|
bool instantiate_connection(asio::io_service& ios
|
||||||
asio::io_service& ios, proxy_settings const& ps)
|
, proxy_settings const& ps, socket_type& s)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<socket_type> s(new socket_type(ios));
|
|
||||||
|
|
||||||
if (ps.type == proxy_settings::none)
|
if (ps.type == proxy_settings::none)
|
||||||
{
|
{
|
||||||
s->instantiate<stream_socket>();
|
s.instantiate<stream_socket>(ios);
|
||||||
}
|
}
|
||||||
else if (ps.type == proxy_settings::http
|
else if (ps.type == proxy_settings::http
|
||||||
|| ps.type == proxy_settings::http_pw)
|
|| ps.type == proxy_settings::http_pw)
|
||||||
{
|
{
|
||||||
s->instantiate<http_stream>();
|
s.instantiate<http_stream>(ios);
|
||||||
s->get<http_stream>().set_proxy(ps.hostname, ps.port);
|
s.get<http_stream>().set_proxy(ps.hostname, ps.port);
|
||||||
if (ps.type == proxy_settings::socks5_pw)
|
if (ps.type == proxy_settings::socks5_pw)
|
||||||
s->get<http_stream>().set_username(ps.username, ps.password);
|
s.get<http_stream>().set_username(ps.username, ps.password);
|
||||||
}
|
}
|
||||||
else if (ps.type == proxy_settings::socks5
|
else if (ps.type == proxy_settings::socks5
|
||||||
|| ps.type == proxy_settings::socks5_pw)
|
|| ps.type == proxy_settings::socks5_pw)
|
||||||
{
|
{
|
||||||
s->instantiate<socks5_stream>();
|
s.instantiate<socks5_stream>(ios);
|
||||||
s->get<socks5_stream>().set_proxy(ps.hostname, ps.port);
|
s.get<socks5_stream>().set_proxy(ps.hostname, ps.port);
|
||||||
if (ps.type == proxy_settings::socks5_pw)
|
if (ps.type == proxy_settings::socks5_pw)
|
||||||
s->get<socks5_stream>().set_username(ps.username, ps.password);
|
s.get<socks5_stream>().set_username(ps.username, ps.password);
|
||||||
}
|
}
|
||||||
else if (ps.type == proxy_settings::socks4)
|
else if (ps.type == proxy_settings::socks4)
|
||||||
{
|
{
|
||||||
s->instantiate<socks4_stream>();
|
s.instantiate<socks4_stream>(ios);
|
||||||
s->get<socks4_stream>().set_proxy(ps.hostname, ps.port);
|
s.get<socks4_stream>().set_proxy(ps.hostname, ps.port);
|
||||||
s->get<socks4_stream>().set_username(ps.username);
|
s.get<socks4_stream>().set_username(ps.username);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw std::runtime_error("unsupported proxy type");
|
return false;
|
||||||
}
|
}
|
||||||
return s;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2209,18 +2209,19 @@ namespace libtorrent
|
||||||
piece_picker& picker = t->picker();
|
piece_picker& picker = t->picker();
|
||||||
while (!m_download_queue.empty())
|
while (!m_download_queue.empty())
|
||||||
{
|
{
|
||||||
picker.abort_download(m_download_queue.back());
|
piece_block const& r = m_download_queue.back();
|
||||||
|
picker.abort_download(r);
|
||||||
|
write_cancel(t->to_req(r));
|
||||||
m_download_queue.pop_back();
|
m_download_queue.pop_back();
|
||||||
}
|
}
|
||||||
while (!m_request_queue.empty())
|
while (!m_request_queue.empty())
|
||||||
{
|
{
|
||||||
picker.abort_download(m_request_queue.back());
|
piece_block const& r = m_request_queue.back();
|
||||||
|
picker.abort_download(r);
|
||||||
|
write_cancel(t->to_req(r));
|
||||||
m_request_queue.pop_back();
|
m_request_queue.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: If we have a limited number of upload
|
|
||||||
// slots, choke this peer
|
|
||||||
|
|
||||||
m_assume_fifo = true;
|
m_assume_fifo = true;
|
||||||
|
|
||||||
request_a_block(*t, *this);
|
request_a_block(*t, *this);
|
||||||
|
@ -2990,11 +2991,25 @@ namespace libtorrent
|
||||||
// time, it is considered to have timed out
|
// time, it is considered to have timed out
|
||||||
time_duration d;
|
time_duration d;
|
||||||
d = now - m_last_receive;
|
d = now - m_last_receive;
|
||||||
if (d > seconds(m_timeout)) return true;
|
if (d > seconds(m_timeout))
|
||||||
|
{
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
(*m_logger) << time_now_string() << " *** LAST ACTIVITY [ "
|
||||||
|
<< total_seconds(d) << " seconds ago ] ***\n";
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// if it takes more than 5 seconds to receive
|
// if it takes more than 5 seconds to receive
|
||||||
// handshake, disconnect
|
// handshake, disconnect
|
||||||
if (in_handshake() && d > seconds(5)) return true;
|
if (in_handshake() && d > seconds(5))
|
||||||
|
{
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
(*m_logger) << time_now_string() << " *** NO HANDSHAKE [ "
|
||||||
|
<< total_seconds(d) << " seconds ago ] ***\n";
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// disconnect peers that we unchoked, but
|
// disconnect peers that we unchoked, but
|
||||||
// they didn't send a request within 20 seconds.
|
// they didn't send a request within 20 seconds.
|
||||||
|
@ -3005,7 +3020,14 @@ namespace libtorrent
|
||||||
&& !m_choked
|
&& !m_choked
|
||||||
&& m_peer_interested
|
&& m_peer_interested
|
||||||
&& t && t->is_finished()
|
&& t && t->is_finished()
|
||||||
&& d > seconds(20)) return true;
|
&& d > seconds(20))
|
||||||
|
{
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
(*m_logger) << time_now_string() << " *** NO REQUEST [ t: "
|
||||||
|
<< total_seconds(d) << " ] ***\n";
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: as long as we have less than 95% of the
|
// TODO: as long as we have less than 95% of the
|
||||||
// global (or local) connection limit, connections should
|
// global (or local) connection limit, connections should
|
||||||
|
@ -3021,11 +3043,21 @@ namespace libtorrent
|
||||||
time_duration time_limit = seconds(
|
time_duration time_limit = seconds(
|
||||||
m_ses.settings().inactivity_timeout);
|
m_ses.settings().inactivity_timeout);
|
||||||
|
|
||||||
|
// don't bother disconnect peers we haven't been intersted
|
||||||
|
// in (and that hasn't been interested in us) for a while
|
||||||
|
// unless we have used up all our connection slots
|
||||||
if (!m_interesting
|
if (!m_interesting
|
||||||
&& !m_peer_interested
|
&& !m_peer_interested
|
||||||
&& d1 > time_limit
|
&& d1 > time_limit
|
||||||
&& d2 > time_limit)
|
&& d2 > time_limit
|
||||||
|
&& (m_ses.num_connections() >= m_ses.max_connections()
|
||||||
|
|| (t && t->num_peers() >= t->max_connections())))
|
||||||
{
|
{
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
(*m_logger) << time_now_string() << " *** MUTUAL NO INTEREST [ "
|
||||||
|
"t1: " << total_seconds(d1) << " | "
|
||||||
|
"t2: " << total_seconds(d2) << " ] ***\n";
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3068,10 +3100,9 @@ namespace libtorrent
|
||||||
if (m_writing) return;
|
if (m_writing) return;
|
||||||
|
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
using namespace boost::posix_time;
|
|
||||||
(*m_logger) << time_now_string() << " ==> KEEPALIVE\n";
|
(*m_logger) << time_now_string() << " ==> KEEPALIVE\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_last_sent = time_now();
|
m_last_sent = time_now();
|
||||||
write_keepalive();
|
write_keepalive();
|
||||||
}
|
}
|
||||||
|
|
|
@ -902,8 +902,8 @@ namespace detail
|
||||||
|
|
||||||
void session_impl::async_accept(boost::shared_ptr<socket_acceptor> const& listener)
|
void session_impl::async_accept(boost::shared_ptr<socket_acceptor> const& listener)
|
||||||
{
|
{
|
||||||
shared_ptr<socket_type> c(new socket_type(m_io_service));
|
shared_ptr<socket_type> c(new socket_type);
|
||||||
c->instantiate<stream_socket>();
|
c->instantiate<stream_socket>(m_io_service);
|
||||||
listener->async_accept(c->get<stream_socket>()
|
listener->async_accept(c->get<stream_socket>()
|
||||||
, bind(&session_impl::on_incoming_connection, this, c
|
, bind(&session_impl::on_incoming_connection, this, c
|
||||||
, boost::weak_ptr<socket_acceptor>(listener), _1));
|
, boost::weak_ptr<socket_acceptor>(listener), _1));
|
||||||
|
|
|
@ -326,6 +326,21 @@ namespace libtorrent
|
||||||
disconnect_all();
|
disconnect_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
peer_request torrent::to_req(piece_block const& p)
|
||||||
|
{
|
||||||
|
int block_offset = p.block_index * m_block_size;
|
||||||
|
int block_size = (std::min)((int)torrent_file().piece_size(
|
||||||
|
p.piece_index) - block_offset, m_block_size);
|
||||||
|
TORRENT_ASSERT(block_size > 0);
|
||||||
|
TORRENT_ASSERT(block_size <= m_block_size);
|
||||||
|
|
||||||
|
peer_request r;
|
||||||
|
r.piece = p.piece_index;
|
||||||
|
r.start = block_offset;
|
||||||
|
r.length = block_size;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
std::string torrent::name() const
|
std::string torrent::name() const
|
||||||
{
|
{
|
||||||
if (valid_metadata()) return m_torrent_file->name();
|
if (valid_metadata()) return m_torrent_file->name();
|
||||||
|
@ -1656,8 +1671,11 @@ namespace libtorrent
|
||||||
else return;
|
else return;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<socket_type> s
|
boost::shared_ptr<socket_type> s(new socket_type);
|
||||||
= instantiate_connection(m_ses.m_io_service, m_ses.web_seed_proxy());
|
|
||||||
|
bool ret = instantiate_connection(m_ses.m_io_service, m_ses.web_seed_proxy(), *s);
|
||||||
|
TORRENT_ASSERT(ret);
|
||||||
|
|
||||||
if (m_ses.web_seed_proxy().type == proxy_settings::http
|
if (m_ses.web_seed_proxy().type == proxy_settings::http
|
||||||
|| m_ses.web_seed_proxy().type == proxy_settings::http_pw)
|
|| m_ses.web_seed_proxy().type == proxy_settings::http_pw)
|
||||||
{
|
{
|
||||||
|
@ -1869,8 +1887,11 @@ namespace libtorrent
|
||||||
tcp::endpoint const& a(peerinfo->ip);
|
tcp::endpoint const& a(peerinfo->ip);
|
||||||
TORRENT_ASSERT((m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked) == 0);
|
TORRENT_ASSERT((m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked) == 0);
|
||||||
|
|
||||||
boost::shared_ptr<socket_type> s
|
boost::shared_ptr<socket_type> s(new socket_type);
|
||||||
= instantiate_connection(m_ses.m_io_service, m_ses.peer_proxy());
|
|
||||||
|
bool ret = instantiate_connection(m_ses.m_io_service, m_ses.peer_proxy(), *s);
|
||||||
|
TORRENT_ASSERT(ret);
|
||||||
|
|
||||||
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, peerinfo));
|
m_ses, shared_from_this(), s, a, peerinfo));
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,7 @@ namespace libtorrent
|
||||||
, m_man(man)
|
, m_man(man)
|
||||||
, m_strand(str)
|
, m_strand(str)
|
||||||
, m_name_lookup(m_strand.io_service())
|
, m_name_lookup(m_strand.io_service())
|
||||||
|
, m_socket(m_strand.io_service())
|
||||||
, m_transaction_id(0)
|
, m_transaction_id(0)
|
||||||
, m_connection_id(0)
|
, m_connection_id(0)
|
||||||
, m_settings(stn)
|
, m_settings(stn)
|
||||||
|
@ -103,7 +104,7 @@ namespace libtorrent
|
||||||
, udp::resolver::iterator i) try
|
, udp::resolver::iterator i) try
|
||||||
{
|
{
|
||||||
if (error == asio::error::operation_aborted) return;
|
if (error == asio::error::operation_aborted) return;
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
if (error || i == udp::resolver::iterator())
|
if (error || i == udp::resolver::iterator())
|
||||||
{
|
{
|
||||||
fail(-1, error.message().c_str());
|
fail(-1, error.message().c_str());
|
||||||
|
@ -143,10 +144,9 @@ namespace libtorrent
|
||||||
|
|
||||||
if (cb) cb->m_tracker_address = tcp::endpoint(target_address.address(), target_address.port());
|
if (cb) cb->m_tracker_address = tcp::endpoint(target_address.address(), target_address.port());
|
||||||
m_target = target_address;
|
m_target = target_address;
|
||||||
m_socket.reset(new datagram_socket(m_name_lookup.io_service()));
|
m_socket.open(target_address.protocol());
|
||||||
m_socket->open(target_address.protocol());
|
m_socket.bind(udp::endpoint(bind_interface(), 0));
|
||||||
m_socket->bind(udp::endpoint(bind_interface(), 0));
|
m_socket.connect(target_address);
|
||||||
m_socket->connect(target_address);
|
|
||||||
send_udp_connect();
|
send_udp_connect();
|
||||||
}
|
}
|
||||||
catch (std::exception& e)
|
catch (std::exception& e)
|
||||||
|
@ -156,7 +156,7 @@ namespace libtorrent
|
||||||
|
|
||||||
void udp_tracker_connection::on_timeout()
|
void udp_tracker_connection::on_timeout()
|
||||||
{
|
{
|
||||||
m_socket.reset();
|
m_socket.close();
|
||||||
m_name_lookup.cancel();
|
m_name_lookup.cancel();
|
||||||
fail_timeout();
|
fail_timeout();
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ namespace libtorrent
|
||||||
+ lexical_cast<std::string>(tracker_req().info_hash) + "]");
|
+ lexical_cast<std::string>(tracker_req().info_hash) + "]");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
|
|
||||||
char send_buf[16];
|
char send_buf[16];
|
||||||
char* ptr = send_buf;
|
char* ptr = send_buf;
|
||||||
|
@ -187,10 +187,10 @@ namespace libtorrent
|
||||||
// transaction_id
|
// transaction_id
|
||||||
detail::write_int32(m_transaction_id, ptr);
|
detail::write_int32(m_transaction_id, ptr);
|
||||||
|
|
||||||
m_socket->send(asio::buffer((void*)send_buf, 16), 0);
|
m_socket.send(asio::buffer((void*)send_buf, 16), 0);
|
||||||
++m_attempts;
|
++m_attempts;
|
||||||
m_buffer.resize(udp_buffer_size);
|
m_buffer.resize(udp_buffer_size);
|
||||||
m_socket->async_receive_from(asio::buffer(m_buffer), m_sender
|
m_socket.async_receive_from(asio::buffer(m_buffer), m_sender
|
||||||
, boost::bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
, boost::bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ namespace libtorrent
|
||||||
, std::size_t bytes_transferred) try
|
, std::size_t bytes_transferred) try
|
||||||
{
|
{
|
||||||
if (error == asio::error::operation_aborted) return;
|
if (error == asio::error::operation_aborted) return;
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
fail(-1, error.message().c_str());
|
fail(-1, error.message().c_str());
|
||||||
|
@ -208,7 +208,7 @@ namespace libtorrent
|
||||||
if (m_target != m_sender)
|
if (m_target != m_sender)
|
||||||
{
|
{
|
||||||
// this packet was not received from the tracker
|
// this packet was not received from the tracker
|
||||||
m_socket->async_receive_from(asio::buffer(m_buffer), m_sender
|
m_socket.async_receive_from(asio::buffer(m_buffer), m_sender
|
||||||
, boost::bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
, boost::bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ namespace libtorrent
|
||||||
if (m_transaction_id == 0)
|
if (m_transaction_id == 0)
|
||||||
m_transaction_id = rand() ^ (rand() << 16);
|
m_transaction_id = rand() ^ (rand() << 16);
|
||||||
|
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
|
|
||||||
std::vector<char> buf;
|
std::vector<char> buf;
|
||||||
std::back_insert_iterator<std::vector<char> > out(buf);
|
std::back_insert_iterator<std::vector<char> > out(buf);
|
||||||
|
@ -332,10 +332,10 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_socket->send(asio::buffer(buf), 0);
|
m_socket.send(asio::buffer(buf), 0);
|
||||||
++m_attempts;
|
++m_attempts;
|
||||||
|
|
||||||
m_socket->async_receive_from(asio::buffer(m_buffer), m_sender
|
m_socket.async_receive_from(asio::buffer(m_buffer), m_sender
|
||||||
, bind(&udp_tracker_connection::announce_response, self(), _1, _2));
|
, bind(&udp_tracker_connection::announce_response, self(), _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ namespace libtorrent
|
||||||
if (m_transaction_id == 0)
|
if (m_transaction_id == 0)
|
||||||
m_transaction_id = rand() ^ (rand() << 16);
|
m_transaction_id = rand() ^ (rand() << 16);
|
||||||
|
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
|
|
||||||
std::vector<char> buf;
|
std::vector<char> buf;
|
||||||
std::back_insert_iterator<std::vector<char> > out(buf);
|
std::back_insert_iterator<std::vector<char> > out(buf);
|
||||||
|
@ -358,10 +358,10 @@ namespace libtorrent
|
||||||
// info_hash
|
// info_hash
|
||||||
std::copy(tracker_req().info_hash.begin(), tracker_req().info_hash.end(), out);
|
std::copy(tracker_req().info_hash.begin(), tracker_req().info_hash.end(), out);
|
||||||
|
|
||||||
m_socket->send(asio::buffer(&buf[0], buf.size()), 0);
|
m_socket.send(asio::buffer(&buf[0], buf.size()), 0);
|
||||||
++m_attempts;
|
++m_attempts;
|
||||||
|
|
||||||
m_socket->async_receive_from(asio::buffer(m_buffer), m_sender
|
m_socket.async_receive_from(asio::buffer(m_buffer), m_sender
|
||||||
, bind(&udp_tracker_connection::scrape_response, self(), _1, _2));
|
, bind(&udp_tracker_connection::scrape_response, self(), _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,7 +369,7 @@ namespace libtorrent
|
||||||
, std::size_t bytes_transferred) try
|
, std::size_t bytes_transferred) try
|
||||||
{
|
{
|
||||||
if (error == asio::error::operation_aborted) return;
|
if (error == asio::error::operation_aborted) return;
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
fail(-1, error.message().c_str());
|
fail(-1, error.message().c_str());
|
||||||
|
@ -379,7 +379,7 @@ namespace libtorrent
|
||||||
if (m_target != m_sender)
|
if (m_target != m_sender)
|
||||||
{
|
{
|
||||||
// this packet was not received from the tracker
|
// this packet was not received from the tracker
|
||||||
m_socket->async_receive_from(asio::buffer(m_buffer), m_sender
|
m_socket.async_receive_from(asio::buffer(m_buffer), m_sender
|
||||||
, bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
, bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -479,7 +479,7 @@ namespace libtorrent
|
||||||
, std::size_t bytes_transferred) try
|
, std::size_t bytes_transferred) try
|
||||||
{
|
{
|
||||||
if (error == asio::error::operation_aborted) return;
|
if (error == asio::error::operation_aborted) return;
|
||||||
if (!m_socket) return; // the operation was aborted
|
if (!m_socket.is_open()) return; // the operation was aborted
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
fail(-1, error.message().c_str());
|
fail(-1, error.message().c_str());
|
||||||
|
@ -489,7 +489,7 @@ namespace libtorrent
|
||||||
if (m_target != m_sender)
|
if (m_target != m_sender)
|
||||||
{
|
{
|
||||||
// this packet was not received from the tracker
|
// this packet was not received from the tracker
|
||||||
m_socket->async_receive_from(asio::buffer(m_buffer), m_sender
|
m_socket.async_receive_from(asio::buffer(m_buffer), m_sender
|
||||||
, bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
, bind(&udp_tracker_connection::connect_response, self(), _1, _2));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue