add send_*_message (#1922)

factor out common message sending code in bt_peer_connection
This commit is contained in:
Pavel Pimenov 2017-04-17 23:26:16 +03:00 committed by Arvid Norberg
parent df299fcb00
commit 9ebbcc2d69
2 changed files with 64 additions and 98 deletions

View File

@ -273,6 +273,13 @@ namespace libtorrent {
private: private:
void write_dht_port(); void write_dht_port();
void send_simple_message(message_type type,
counters::stats_counter_t counter);
void send_piece_message(message_type type,
counters::stats_counter_t counter, piece_index_t index);
void send_request_message(message_type type,
counters::stats_counter_t counter, peer_request const& r,
int flag);
bool dispatch_message(int received); bool dispatch_message(int received);
// returns the block currently being // returns the block currently being

View File

@ -358,32 +358,69 @@ namespace libtorrent {
stats_counters().inc_stats_counter(counters::num_outgoing_dht_port); stats_counters().inc_stats_counter(counters::num_outgoing_dht_port);
} }
void bt_peer_connection::send_piece_message(message_type const type
, counters::stats_counter_t const counter, piece_index_t const index)
{
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
char msg[] = { 0,0,0,5, static_cast<char>(type), 0, 0, 0, 0 };
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(index), ptr);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counter);
}
void bt_peer_connection::send_simple_message(message_type const type
, counters::stats_counter_t const counter)
{
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
char msg[] = { 0,0,0,1,static_cast<char>(type) };
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counter);
}
void bt_peer_connection::send_request_message(message_type const type
, counters::stats_counter_t const counter, peer_request const& r, int const flag)
{
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
TORRENT_ASSERT(associated_torrent().lock()->valid_metadata());
char msg[17] = { 0,0,0,13, static_cast<char>(type) };
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(r.piece), ptr); // index
detail::write_int32(r.start, ptr); // begin
detail::write_int32(r.length, ptr); // length
send_buffer(msg, sizeof(msg), flag);
stats_counters().inc_stats_counter(counter);
}
void bt_peer_connection::write_have_all() void bt_peer_connection::write_have_all()
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake);
m_sent_bitfield = true; m_sent_bitfield = true;
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
peer_log(peer_log_alert::outgoing_message, "HAVE_ALL"); peer_log(peer_log_alert::outgoing_message, "HAVE_ALL");
#endif #endif
static const char msg[] = {0,0,0,1, msg_have_all}; send_simple_message(msg_have_all, counters::num_outgoing_have_all);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_have_all);
} }
void bt_peer_connection::write_have_none() void bt_peer_connection::write_have_none()
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake);
m_sent_bitfield = true; m_sent_bitfield = true;
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
peer_log(peer_log_alert::outgoing_message, "HAVE_NONE"); peer_log(peer_log_alert::outgoing_message, "HAVE_NONE");
#endif #endif
static const char msg[] = {0,0,0,1, msg_have_none}; send_simple_message(msg_have_none, counters::num_outgoing_have_none);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_have_none);
} }
void bt_peer_connection::write_reject_request(peer_request const& r) void bt_peer_connection::write_reject_request(peer_request const& r)
@ -399,18 +436,8 @@ namespace libtorrent {
, "piece: %d | s: %d | l: %d", static_cast<int>(r.piece) , "piece: %d | s: %d | l: %d", static_cast<int>(r.piece)
, r.start, r.length); , r.start, r.length);
#endif #endif
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
TORRENT_ASSERT(associated_torrent().lock()->valid_metadata());
char msg[] = {0,0,0,13, msg_reject_request,0,0,0,0, 0,0,0,0, 0,0,0,0}; send_request_message(msg_reject_request, counters::num_outgoing_reject, r, 0);
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(r.piece), ptr); // index
detail::write_int32(r.start, ptr); // begin
detail::write_int32(r.length, ptr); // length
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_reject);
} }
void bt_peer_connection::write_allow_fast(piece_index_t const piece) void bt_peer_connection::write_allow_fast(piece_index_t const piece)
@ -424,16 +451,9 @@ namespace libtorrent {
, static_cast<int>(piece)); , static_cast<int>(piece));
#endif #endif
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
TORRENT_ASSERT(associated_torrent().lock()->valid_metadata()); TORRENT_ASSERT(associated_torrent().lock()->valid_metadata());
char msg[] = {0,0,0,5, msg_allowed_fast, 0, 0, 0, 0}; send_piece_message(msg_allowed_fast, counters::num_outgoing_allowed_fast, piece);
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(piece), ptr);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_allowed_fast);
} }
void bt_peer_connection::write_suggest(piece_index_t const piece) void bt_peer_connection::write_suggest(piece_index_t const piece)
@ -442,9 +462,6 @@ namespace libtorrent {
if (!m_supports_fast) return; if (!m_supports_fast) return;
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
std::shared_ptr<torrent> t = associated_torrent().lock(); std::shared_ptr<torrent> t = associated_torrent().lock();
TORRENT_ASSERT(t); TORRENT_ASSERT(t);
TORRENT_ASSERT(t->valid_metadata()); TORRENT_ASSERT(t->valid_metadata());
@ -458,12 +475,7 @@ namespace libtorrent {
} }
#endif #endif
char msg[] = {0,0,0,5, msg_suggest_piece, 0, 0, 0, 0}; send_piece_message(msg_suggest_piece, counters::num_outgoing_suggest, piece);
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(piece), ptr);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_suggest);
} }
void bt_peer_connection::get_specific_peer_info(peer_info& p) const void bt_peer_connection::get_specific_peer_info(peer_info& p) const
@ -2034,18 +2046,7 @@ namespace libtorrent {
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake); send_request_message(msg_cancel, counters::num_outgoing_cancel, r, 0);
TORRENT_ASSERT(m_sent_bitfield);
TORRENT_ASSERT(associated_torrent().lock()->valid_metadata());
char msg[17] = {0,0,0,13, msg_cancel};
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(r.piece), ptr); // index
detail::write_int32(r.start, ptr); // begin
detail::write_int32(r.length, ptr); // length
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_cancel);
if (!m_supports_fast) if (!m_supports_fast)
incoming_reject_request(r); incoming_reject_request(r);
@ -2055,19 +2056,7 @@ namespace libtorrent {
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake); send_request_message(msg_request, counters::num_outgoing_request, r, message_type_request);
TORRENT_ASSERT(m_sent_bitfield);
TORRENT_ASSERT(associated_torrent().lock()->valid_metadata());
char msg[17] = {0,0,0,13, msg_request};
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(r.piece), ptr); // index
detail::write_int32(r.start, ptr); // begin
detail::write_int32(r.length, ptr); // length
send_buffer(msg, sizeof(msg), message_type_request);
stats_counters().inc_stats_counter(counters::num_outgoing_request);
} }
void bt_peer_connection::write_bitfield() void bt_peer_connection::write_bitfield()
@ -2302,27 +2291,15 @@ namespace libtorrent {
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake);
TORRENT_ASSERT(m_sent_bitfield);
if (is_choked()) return; if (is_choked()) return;
static const char msg[] = {0,0,0,1,msg_choke}; send_simple_message(msg_choke, counters::num_outgoing_choke);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_choke);
} }
void bt_peer_connection::write_unchoke() void bt_peer_connection::write_unchoke()
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake); send_simple_message(msg_unchoke, counters::num_outgoing_unchoke);
TORRENT_ASSERT(m_sent_bitfield);
static const char msg[] = {0,0,0,1,msg_unchoke};
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_unchoke);
#ifndef TORRENT_DISABLE_EXTENSIONS #ifndef TORRENT_DISABLE_EXTENSIONS
for (auto const& e : m_extensions) for (auto const& e : m_extensions)
@ -2336,26 +2313,14 @@ namespace libtorrent {
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake); send_simple_message(msg_interested, counters::num_outgoing_interested);
TORRENT_ASSERT(m_sent_bitfield);
static const char msg[] = {0,0,0,1,msg_interested};
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_interested);
} }
void bt_peer_connection::write_not_interested() void bt_peer_connection::write_not_interested()
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
TORRENT_ASSERT(m_sent_handshake); send_simple_message(msg_not_interested, counters::num_outgoing_not_interested);
TORRENT_ASSERT(m_sent_bitfield);
static const char msg[] = {0,0,0,1,msg_not_interested};
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_not_interested);
} }
void bt_peer_connection::write_have(piece_index_t index) void bt_peer_connection::write_have(piece_index_t index)
@ -2364,18 +2329,12 @@ namespace libtorrent {
TORRENT_ASSERT(associated_torrent().lock()->valid_metadata()); TORRENT_ASSERT(associated_torrent().lock()->valid_metadata());
TORRENT_ASSERT(index >= piece_index_t(0)); TORRENT_ASSERT(index >= piece_index_t(0));
TORRENT_ASSERT(index < associated_torrent().lock()->torrent_file().end_piece()); TORRENT_ASSERT(index < associated_torrent().lock()->torrent_file().end_piece());
TORRENT_ASSERT(m_sent_handshake);
// if we haven't sent the bitfield yet, this piece should be included in // if we haven't sent the bitfield yet, this piece should be included in
// there instead // there instead
if (!m_sent_bitfield) return; if (!m_sent_bitfield) return;
char msg[] = {0,0,0,5,msg_have,0,0,0,0}; send_piece_message(msg_have, counters::num_outgoing_have, index);
char* ptr = msg + 5;
detail::write_int32(static_cast<int>(index), ptr);
send_buffer(msg, sizeof(msg));
stats_counters().inc_stats_counter(counters::num_outgoing_have);
} }
void bt_peer_connection::write_dont_have(piece_index_t const index) void bt_peer_connection::write_dont_have(piece_index_t const index)