*** empty log message ***

This commit is contained in:
Arvid Norberg 2004-01-28 11:37:46 +00:00
parent 7d1f292e67
commit 03561913df
7 changed files with 29 additions and 21 deletions

View File

@ -112,7 +112,7 @@ peers in a separate fast-resume file.</li>
<li>possibility to limit the number of connections.</li> <li>possibility to limit the number of connections.</li>
<li>delays have messages if there's no other outgoing traffic to the peer, and doesn't <li>delays have messages if there's no other outgoing traffic to the peer, and doesn't
send have messages to peers that already has the piece. This saves bandwidth.</li> send have messages to peers that already has the piece. This saves bandwidth.</li>
<li>Does not have any requirements on the piece order in a torrent that it resumes. This <li>does not have any requirements on the piece order in a torrent that it resumes. This
means it can resume a torrent downloaded by any client.</li> means it can resume a torrent downloaded by any client.</li>
</ul> </ul>
</blockquote> </blockquote>

View File

@ -44,7 +44,7 @@ The current state includes the following features:
* possibility to limit the number of connections. * possibility to limit the number of connections.
* delays have messages if there's no other outgoing traffic to the peer, and doesn't * delays have messages if there's no other outgoing traffic to the peer, and doesn't
send have messages to peers that already has the piece. This saves bandwidth. send have messages to peers that already has the piece. This saves bandwidth.
* Does not have any requirements on the piece order in a torrent that it resumes. This * does not have any requirements on the piece order in a torrent that it resumes. This
means it can resume a torrent downloaded by any client. means it can resume a torrent downloaded by any client.
__ http://home.elp.rr.com/tur/multitracker-spec.txt __ http://home.elp.rr.com/tur/multitracker-spec.txt

View File

@ -225,7 +225,7 @@ until reannouncing yourself.</td>
</tr> </tr>
<tr><td>uint16_t</td> <tr><td>uint16_t</td>
<td>port</td> <td>port</td>
<td>The peers listen port.</td> <td>The peer's listen port.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -260,7 +260,7 @@ scrape.</td>
<td>transaction_id</td> <td>transaction_id</td>
<td>Randomized by client.</td> <td>Randomized by client.</td>
</tr> </tr>
<tr><td>int8[20]</td> <tr><td>int8_t[20]</td>
<td>info_hash</td> <td>info_hash</td>
<td>The info hash that is to be scraped.</td> <td>The info hash that is to be scraped.</td>
</tr> </tr>
@ -352,7 +352,7 @@ leechers.</td>
<td>Must match the transaction_id sent <td>Must match the transaction_id sent
from the client.</td> from the client.</td>
</tr> </tr>
<tr><td>int8[]</td> <tr><td>int8_t[]</td>
<td>error_string</td> <td>error_string</td>
<td>The rest of the packet is a string <td>The rest of the packet is a string
describing the error.</td> describing the error.</td>

View File

@ -131,7 +131,7 @@ The rest of the server reply is a variable number of the following structure:
+=============+=====================+========================================+ +=============+=====================+========================================+
| int32_t | ip | The ip of a peer in the swarm. | | int32_t | ip | The ip of a peer in the swarm. |
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+
| uint16_t | port | The peers listen port. | | uint16_t | port | The peer's listen port. |
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+
@ -151,7 +151,7 @@ Client sends packet:
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+
| int32_t | transaction_id | Randomized by client. | | int32_t | transaction_id | Randomized by client. |
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+
| int8[20] | info_hash | The info hash that is to be scraped. | | int8_t[20] | info_hash | The info hash that is to be scraped. |
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+
Server replies with packet: Server replies with packet:
@ -195,7 +195,7 @@ In case of a tracker error, the server replies with this packet:
| int32_t | transaction_id | Must match the transaction_id sent | | int32_t | transaction_id | Must match the transaction_id sent |
| | | from the client. | | | | from the client. |
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+
| int8[] | error_string | The rest of the packet is a string | | int8_t[] | error_string | The rest of the packet is a string |
| | | describing the error. | | | | describing the error. |
+-------------+---------------------+----------------------------------------+ +-------------+---------------------+----------------------------------------+

View File

@ -66,8 +66,7 @@ POSSIBILITY OF SUCH DAMAGE.
// 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
// a chance to request another block instead. // a chance to become not-interested.
// Where it also could become not-interested.
namespace libtorrent namespace libtorrent
{ {
@ -199,7 +198,8 @@ namespace libtorrent
boost::shared_ptr<libtorrent::socket> get_socket() const { return m_socket; } boost::shared_ptr<libtorrent::socket> get_socket() const { return m_socket; }
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; }
// this will cause this peer_connection to be disconnected. // this will cause this peer_connection to be disconnected.
// what it does is that it puts a reference to it in // what it does is that it puts a reference to it in
@ -446,6 +446,12 @@ namespace libtorrent
// the pieces the other end have // the pieces the other end have
std::vector<bool> m_have_piece; std::vector<bool> m_have_piece;
// the number of pieces this peer
// has. Must be the same as
// std::count(m_have_piece.begin(),
// m_have_piece.end(), true)
int m_num_pieces;
// the queue of requests we have got // the queue of requests we have got
// from this peer // from this peer
std::deque<peer_request> m_requests; std::deque<peer_request> m_requests;

View File

@ -98,6 +98,7 @@ namespace libtorrent
, m_interesting(false) , m_interesting(false)
, m_choked(true) , m_choked(true)
, m_supports_extensions(false) , m_supports_extensions(false)
, m_num_pieces(0)
, m_free_upload(0) , m_free_upload(0)
, m_send_quota(100) , m_send_quota(100)
, m_send_quota_left(100) , m_send_quota_left(100)
@ -160,6 +161,7 @@ namespace libtorrent
, m_interesting(false) , m_interesting(false)
, m_choked(true) , m_choked(true)
, m_supports_extensions(false) , m_supports_extensions(false)
, m_num_pieces(0)
, m_free_upload(0) , m_free_upload(0)
, m_send_quota(100) , m_send_quota(100)
, m_send_quota_left(100) , m_send_quota_left(100)
@ -454,8 +456,9 @@ namespace libtorrent
else else
{ {
m_have_piece[index] = true; m_have_piece[index] = true;
++m_num_pieces;
m_torrent->peer_has(index); m_torrent->peer_has(index);
if (!m_torrent->have_piece(index) && !is_interesting()) if (!m_torrent->have_piece(index) && !is_interesting())
m_torrent->get_policy().peer_is_interesting(*this); m_torrent->get_policy().peer_is_interesting(*this);
@ -491,11 +494,13 @@ namespace libtorrent
if (have && !m_have_piece[i]) if (have && !m_have_piece[i])
{ {
m_have_piece[i] = true; m_have_piece[i] = true;
++m_num_pieces;
piece_list.push_back(i); piece_list.push_back(i);
} }
else if (!have && m_have_piece[i]) else if (!have && m_have_piece[i])
{ {
m_have_piece[i] = false; m_have_piece[i] = false;
--m_num_pieces;
m_torrent->peer_lost(i); m_torrent->peer_lost(i);
} }
} }
@ -1705,6 +1710,11 @@ namespace libtorrent
void peer_connection::check_invariant() const void peer_connection::check_invariant() const
{ {
assert(has_data() == m_selector.is_writability_monitored(m_socket)); assert(has_data() == m_selector.is_writability_monitored(m_socket));
assert(m_num_pieces == std::count(
m_have_piece.begin()
, m_have_piece.end()
, true));
} }
#endif #endif

View File

@ -243,7 +243,7 @@ namespace libtorrent
i != pieces.end(); i != pieces.end();
++i) ++i)
{ {
*i = i - pieces.begin(); *i = static_cast<int>(i - pieces.begin());
} }
std::srand((unsigned int)std::time(0)); std::srand((unsigned int)std::time(0));
std::vector<int> targets(pieces); std::vector<int> targets(pieces);
@ -1333,8 +1333,6 @@ namespace libtorrent
// case 1 // case 1
if (this_should_move && !other_should_move) if (this_should_move && !other_should_move)
{ {
INVARIANT_CHECK;
assert(piece_index != current_slot); assert(piece_index != current_slot);
const int other_slot = piece_index; const int other_slot = piece_index;
@ -1372,8 +1370,6 @@ namespace libtorrent
// case 2 // case 2
else if (!this_should_move && other_should_move) else if (!this_should_move && other_should_move)
{ {
INVARIANT_CHECK;
assert(piece_index != current_slot); assert(piece_index != current_slot);
const int other_piece = current_slot; const int other_piece = current_slot;
@ -1406,8 +1402,6 @@ namespace libtorrent
} }
else if (this_should_move && other_should_move) else if (this_should_move && other_should_move)
{ {
INVARIANT_CHECK;
assert(piece_index != current_slot); assert(piece_index != current_slot);
assert(piece_index >= 0); assert(piece_index >= 0);
@ -1463,8 +1457,6 @@ namespace libtorrent
} }
else else
{ {
INVARIANT_CHECK;
assert(m_piece_to_slot[current_slot] == has_no_slot || piece_index != current_slot); assert(m_piece_to_slot[current_slot] == has_no_slot || piece_index != current_slot);
assert(m_slot_to_piece[current_slot] == unallocated); assert(m_slot_to_piece[current_slot] == unallocated);
assert(piece_index == unassigned || m_piece_to_slot[piece_index] == has_no_slot); assert(piece_index == unassigned || m_piece_to_slot[piece_index] == has_no_slot);