*** empty log message ***

This commit is contained in:
Arvid Norberg 2004-01-14 01:19:30 +00:00
parent abbedbf104
commit 9983e7c85b
8 changed files with 167 additions and 106 deletions

View File

@ -40,29 +40,29 @@
<li><a class="reference" href="#tracker-alert" id="id29" name="id29">tracker_alert</a></li>
<li><a class="reference" href="#hash-failed-alert" id="id30" name="id30">hash_failed_alert</a></li>
<li><a class="reference" href="#peer-error-alert" id="id31" name="id31">peer_error_alert</a></li>
<li><a class="reference" href="#chat-message-alert" id="id32" name="id32">chat_message_alert</a></li>
<li><a class="reference" href="#dispatcher" id="id33" name="id33">dispatcher</a></li>
<li><a class="reference" href="#invalid-request-alert" id="id32" name="id32">invalid_request_alert</a></li>
<li><a class="reference" href="#chat-message-alert" id="id33" name="id33">chat_message_alert</a></li>
<li><a class="reference" href="#dispatcher" id="id34" name="id34">dispatcher</a></li>
</ul>
</li>
<li><a class="reference" href="#exceptions" id="id34" name="id34">exceptions</a><ul>
<li><a class="reference" href="#invalid-handle" id="id35" name="id35">invalid_handle</a></li>
<li><a class="reference" href="#duplicate-torrent" id="id36" name="id36">duplicate_torrent</a></li>
<li><a class="reference" href="#invalid-encoding" id="id37" name="id37">invalid_encoding</a></li>
<li><a class="reference" href="#type-error" id="id38" name="id38">type_error</a></li>
<li><a class="reference" href="#invalid-torrent-file" id="id39" name="id39">invalid_torrent_file</a></li>
<li><a class="reference" href="#exceptions" id="id35" name="id35">exceptions</a><ul>
<li><a class="reference" href="#invalid-handle" id="id36" name="id36">invalid_handle</a></li>
<li><a class="reference" href="#duplicate-torrent" id="id37" name="id37">duplicate_torrent</a></li>
<li><a class="reference" href="#invalid-encoding" id="id38" name="id38">invalid_encoding</a></li>
<li><a class="reference" href="#type-error" id="id39" name="id39">type_error</a></li>
<li><a class="reference" href="#invalid-torrent-file" id="id40" name="id40">invalid_torrent_file</a></li>
</ul>
</li>
<li><a class="reference" href="#examples" id="id40" name="id40">examples</a><ul>
<li><a class="reference" href="#dump-torrent" id="id41" name="id41">dump_torrent</a></li>
<li><a class="reference" href="#simple-client" id="id42" name="id42">simple client</a></li>
<li><a class="reference" href="#examples" id="id41" name="id41">examples</a><ul>
<li><a class="reference" href="#dump-torrent" id="id42" name="id42">dump_torrent</a></li>
<li><a class="reference" href="#simple-client" id="id43" name="id43">simple client</a></li>
</ul>
</li>
<li><a class="reference" href="#fast-resume" id="id43" name="id43">fast resume</a></li>
<li><a class="reference" href="#file-format" id="id44" name="id44">file format</a></li>
<li><a class="reference" href="#extensions" id="id45" name="id45">extensions</a><ul>
<li><a class="reference" href="#chat-messages" id="id46" name="id46">chat messages</a></li>
<li><a class="reference" href="#fast-resume" id="id44" name="id44">fast resume</a><ul>
<li><a class="reference" href="#file-format" id="id45" name="id45">file format</a></li>
</ul>
</li>
<li><a class="reference" href="#extensions" id="id46" name="id46">extensions</a></li>
<li><a class="reference" href="#aknowledgements" id="id47" name="id47">Aknowledgements</a></li>
</ul>
</div>
@ -100,7 +100,7 @@ party.</li>
<li>fast resume support, a way to get rid of the costly piece check at the start
of a resumed torrent. Saves the storage state, piece_picker state as well as all local
peers in a separate fast-resume file.</li>
<li>The extension protocol <a class="reference" href="http://nolar.com/azureus/extended.htm">described by Nolar</a>. See <a class="reference" href="#extensions">extensions</a>.</li>
<li>Supports the extension protocol <a class="reference" href="http://nolar.com/azureus/extended.htm">described by Nolar</a>. See <a class="reference" href="#extensions">extensions</a>.</li>
</ul>
</blockquote>
<p>Functions that are yet to be implemented:</p>
@ -128,6 +128,7 @@ boost.filesystem, boost.date_time and various other boost libraries as well as z
<li>GCC 2.95</li>
</ul>
</blockquote>
<p>libtorrent is released under the <a class="reference" href="http://www.opensource.org/licenses/bsd-license.php">BSD-license</a>.</p>
</div>
<div class="section" id="building">
<h1><a class="toc-backref" href="#id10" name="building">building</a></h1>
@ -1057,8 +1058,28 @@ struct peer_error_alert: alert
};
</pre>
</div>
<div class="section" id="invalid-request-alert">
<h2><a class="toc-backref" href="#id32" name="invalid-request-alert">invalid_request_alert</a></h2>
<p>Thie is a debug alert that is generated by an incoming invalid piece request.</p>
<pre class="literal-block">
struct invalid_request_alert: alert
{
invalid_request_alert(
const peer_request&amp; r
, const torrent_handle&amp; h
, const peer_id&amp; send
, const std::string&amp; msg);
virtual std::auto_ptr&lt;alert&gt; clone() const;
torrent_handle handle;
peer_id sender;
peer_request request;
};
</pre>
</div>
<div class="section" id="chat-message-alert">
<h2><a class="toc-backref" href="#id32" name="chat-message-alert">chat_message_alert</a></h2>
<h2><a class="toc-backref" href="#id33" name="chat-message-alert">chat_message_alert</a></h2>
<p>This alert is generated when you receive a chat message from another peer. Chat messages
are supported as an extension (&quot;chat&quot;). It is generated as severity level <tt class="literal"><span class="pre">critical</span></tt>,
even though it doesn't necessarily require any user intervention, it's high priority
@ -1080,16 +1101,16 @@ struct chat_message_alert: alert
</pre>
</div>
<div class="section" id="dispatcher">
<h2><a class="toc-backref" href="#id33" name="dispatcher">dispatcher</a></h2>
<h2><a class="toc-backref" href="#id34" name="dispatcher">dispatcher</a></h2>
<p>TODO: describe the dispatcher mechanism</p>
</div>
</div>
<div class="section" id="exceptions">
<h1><a class="toc-backref" href="#id34" name="exceptions">exceptions</a></h1>
<h1><a class="toc-backref" href="#id35" name="exceptions">exceptions</a></h1>
<p>There are a number of exceptions that can be thrown from different places in libtorrent,
here's a complete list with description.</p>
<div class="section" id="invalid-handle">
<h2><a class="toc-backref" href="#id35" name="invalid-handle">invalid_handle</a></h2>
<h2><a class="toc-backref" href="#id36" name="invalid-handle">invalid_handle</a></h2>
<p>This exception is thrown when querying information from a <a class="reference" href="#torrent-handle">torrent_handle</a> that hasn't
been initialized or that has become invalid.</p>
<pre class="literal-block">
@ -1100,7 +1121,7 @@ struct invalid_handle: std::exception
</pre>
</div>
<div class="section" id="duplicate-torrent">
<h2><a class="toc-backref" href="#id36" name="duplicate-torrent">duplicate_torrent</a></h2>
<h2><a class="toc-backref" href="#id37" name="duplicate-torrent">duplicate_torrent</a></h2>
<p>This is thrown by <tt class="literal"><span class="pre">session::add_torrent()</span></tt> if the torrent already has been added to
the session.</p>
<pre class="literal-block">
@ -1111,7 +1132,7 @@ struct duplicate_torrent: std::exception
</pre>
</div>
<div class="section" id="invalid-encoding">
<h2><a class="toc-backref" href="#id37" name="invalid-encoding">invalid_encoding</a></h2>
<h2><a class="toc-backref" href="#id38" name="invalid-encoding">invalid_encoding</a></h2>
<p>This is thrown by <tt class="literal"><span class="pre">bdecode()</span></tt> if the input data is not a valid bencoding.</p>
<pre class="literal-block">
struct invalid_encoding: std::exception
@ -1121,7 +1142,7 @@ struct invalid_encoding: std::exception
</pre>
</div>
<div class="section" id="type-error">
<h2><a class="toc-backref" href="#id38" name="type-error">type_error</a></h2>
<h2><a class="toc-backref" href="#id39" name="type-error">type_error</a></h2>
<p>This is thrown from the accessors of <tt class="literal"><span class="pre">entry</span></tt> if the data type of the <tt class="literal"><span class="pre">entry</span></tt> doesn't
match the type you want to extract from it.</p>
<pre class="literal-block">
@ -1132,7 +1153,7 @@ struct type_error: std::runtime_error
</pre>
</div>
<div class="section" id="invalid-torrent-file">
<h2><a class="toc-backref" href="#id39" name="invalid-torrent-file">invalid_torrent_file</a></h2>
<h2><a class="toc-backref" href="#id40" name="invalid-torrent-file">invalid_torrent_file</a></h2>
<p>This exception is thrown from the constructor of <tt class="literal"><span class="pre">torrent_info</span></tt> if the given bencoded information
doesn't meet the requirements on what information has to be present in a torrent file.</p>
<pre class="literal-block">
@ -1144,9 +1165,9 @@ struct invalid_torrent_file: std::exception
</div>
</div>
<div class="section" id="examples">
<h1><a class="toc-backref" href="#id40" name="examples">examples</a></h1>
<h1><a class="toc-backref" href="#id41" name="examples">examples</a></h1>
<div class="section" id="dump-torrent">
<h2><a class="toc-backref" href="#id41" name="dump-torrent">dump_torrent</a></h2>
<h2><a class="toc-backref" href="#id42" name="dump-torrent">dump_torrent</a></h2>
<p>This is an example of a program that will take a torrent-file as a parameter and
print information about it to std out:</p>
<pre class="literal-block">
@ -1210,7 +1231,7 @@ int main(int argc, char* argv[])
</pre>
</div>
<div class="section" id="simple-client">
<h2><a class="toc-backref" href="#id42" name="simple-client">simple client</a></h2>
<h2><a class="toc-backref" href="#id43" name="simple-client">simple client</a></h2>
<p>This is a simple client. It doesn't have much output to keep it simple:</p>
<pre class="literal-block">
#include &lt;iostream&gt;
@ -1262,7 +1283,7 @@ int main(int argc, char* argv[])
</div>
</div>
<div class="section" id="fast-resume">
<h1><a class="toc-backref" href="#id43" name="fast-resume">fast resume</a></h1>
<h1><a class="toc-backref" href="#id44" name="fast-resume">fast resume</a></h1>
<p>The fast resume mechanism is a way to remember which pieces are downloaded and where they
are put between sessions. You can generate fast resume data by calling
<tt class="literal"><span class="pre">torrent_handle::write_resume_data()</span></tt> on <a class="reference" href="#torrent-handle">torrent_handle</a>. You can then save this data
@ -1274,9 +1295,8 @@ so it will not have to start from scratch on the partially downloaded pieces.</p
will skip the time consuming checks. It may have to do the checking anyway, if the
fast-resume data is corrupt or doesn't fit the storage for that torrent, then it will
not trust the fast-resume data and just do the checking.</p>
</div>
<div class="section" id="file-format">
<h1><a class="toc-backref" href="#id44" name="file-format">file format</a></h1>
<h2><a class="toc-backref" href="#id45" name="file-format">file format</a></h2>
<p>The file format is a bencoded dictionary containing the following fields:</p>
<table border class="table">
<colgroup>
@ -1297,7 +1317,7 @@ not trust the fast-resume data and just do the checking.</p>
<td>integer, the number of blocks per piece. Must be: piece_size
/ (16 * 1024). Clamped to be within the range [1, 128]. It
is the number of blocks per (normal sized) piece. Usually
each piece is 16 * 1024 bytes in size.</td>
each block is 16 * 1024 bytes in size.</td>
</tr>
<tr><td><tt class="literal"><span class="pre">slots</span></tt></td>
<td><p class="first">list of integers. The list mappes slots ti piece indices. It
@ -1355,39 +1375,32 @@ piece.</td>
</tbody>
</table>
</div>
</div>
<div class="section" id="extensions">
<h1><a class="toc-backref" href="#id45" name="extensions">extensions</a></h1>
<h1><a class="toc-backref" href="#id46" name="extensions">extensions</a></h1>
<p>These extensions all operates within the <a class="reference" href="http://nolar.com/azureus/extended.html">extension protocol</a>. The
name of the extension is the name used in the extension-list packets,
and the payload is the data in the extended message (not counting the
length-prefix, message-id nor extension-id).</p>
<p>These are the extensions that are currently implemented.</p>
<div class="section" id="chat-messages">
<h2><a class="toc-backref" href="#id46" name="chat-messages">chat messages</a></h2>
<p>Extension name: &quot;chat&quot;</p>
<p>The payload in the packet is a bencoded dictionary with any
combination of the following entries:</p>
<table border class="table">
<colgroup>
<col width="15%" />
<col width="85%" />
</colgroup>
<tbody valign="top">
<tr><td>&quot;msg&quot;</td>
<td>This is a string that contains a message that
should be displayed to the user.</td>
</tr>
<tr><td>&quot;ctrl&quot;</td>
<td>This is a control string that can tell a client that
it is ignored (to make the user aware of that) and
it can also tell a client that it is no longer ignored.
These notifications are encoded as the strings:
&quot;ignored&quot; and &quot;not ignored&quot;.
Any unrecognized strings should be ignored.</td>
</tr>
</tbody>
</table>
</div>
<p>The extension protocol is currently disabled, since it may not be compatible
with future versions of bittorrent.</p>
<!-- These are the extensions that are currently implemented. -->
<!-- chat messages -->
<!-- - - - - - - - - - - - - - -->
<!-- Extension name: "chat" -->
<!-- The payload in the packet is a bencoded dictionary with any -->
<!-- combination of the following entries: -->
<!-- +- - - - - - - - - -+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
| "msg" | This is a string that contains a message that |
| | should be displayed to the user. |
+- - - - - - - - - -+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
| "ctrl" | This is a control string that can tell a client that |
| | it is ignored (to make the user aware of that) and |
| | it can also tell a client that it is no longer ignored.|
| | These notifications are encoded as the strings: |
| | "ignored" and "not ignored". |
| | Any unrecognized strings should be ignored. |
+- - - - - - - - - -+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ -->
</div>
<div class="section" id="aknowledgements">
<h1><a class="toc-backref" href="#id47" name="aknowledgements">Aknowledgements</a></h1>

View File

@ -39,7 +39,7 @@ The current state includes the following features:
* fast resume support, a way to get rid of the costly piece check at the start
of a resumed torrent. Saves the storage state, piece_picker state as well as all local
peers in a separate fast-resume file.
* The extension protocol `described by Nolar`__. See extensions_.
* Supports the extension protocol `described by Nolar`__. See extensions_.
__ http://home.elp.rr.com/tur/multitracker-spec.txt
.. _Azureus: http://azureus.sourceforge.net
@ -65,6 +65,10 @@ It does not compile on
* GCC 2.95
libtorrent is released under the BSD-license_.
.. _BSD-license: http://www.opensource.org/licenses/bsd-license.php
building
========
@ -74,7 +78,7 @@ Then you can use ``bjam`` to build libtorrent.
.. _boost: http://www.boost.org
To make bjam work, you need to set the environment variable ``BOOST_ROOT`` to the
path where boost is installed (e.g. c:\boost_1_30_2 on windows). Then you can just run
path where boost is installed (e.g. c:\\boost_1_30_2 on windows). Then you can just run
``bjam`` in the libtorrent directory.
The Jamfile doesn't work yet. On unix-systems you can use the makefile however. You
@ -1373,21 +1377,25 @@ fast-resume data is corrupt or doesn't fit the storage for that torrent, then it
not trust the fast-resume data and just do the checking.
file format
===========
-----------
The file format is a bencoded dictionary containing the following fields:
+----------------------+--------------------------------------------------------------+
| ``file-format`` | string: "libtorrent resume file" |
| | |
+----------------------+--------------------------------------------------------------+
| ``file-version`` | integer: 1 |
| | |
+----------------------+--------------------------------------------------------------+
| ``info-hash`` | string, the info hash of the torrent this data is saved for. |
| | |
+----------------------+--------------------------------------------------------------+
| ``blocks per piece`` | integer, the number of blocks per piece. Must be: piece_size |
| | / (16 * 1024). Clamped to be within the range [1, 128]. It |
| | is the number of blocks per (normal sized) piece. Usually |
| | each piece is 16 * 1024 bytes in size. |
| | each block is 16 * 1024 bytes in size. |
| | |
+----------------------+--------------------------------------------------------------+
| ``slots`` | list of integers. The list mappes slots ti piece indices. It |
| | tells which piece is on which slot. If piece index is -2 it |
@ -1397,6 +1405,7 @@ The file format is a bencoded dictionary containing the following fields:
| | |
| | If there's a slot at the position of the piece index, |
| | the piece must be located in that slot. |
| | |
+----------------------+--------------------------------------------------------------+
| ``peers`` | list of dictionaries. Each dictionary has the following |
| | layout: |
@ -1409,6 +1418,7 @@ The file format is a bencoded dictionary containing the following fields:
| | |
| | These are the local peers we were connected to when this |
| | fast-resume data was saved. |
| | |
+----------------------+--------------------------------------------------------------+
| ``unfinished`` | list of dictionaries. Each dictionary represents an |
| | piece, and has the following layout: |
@ -1435,27 +1445,30 @@ length-prefix, message-id nor extension-id).
__ http://nolar.com/azureus/extended.html
These are the extensions that are currently implemented.
The extension protocol is currently disabled, since it may not be compatible
with future versions of bittorrent.
chat messages
-------------
.. These are the extensions that are currently implemented.
Extension name: "chat"
.. chat messages
.. -------------
The payload in the packet is a bencoded dictionary with any
combination of the following entries:
.. Extension name: "chat"
+----------+--------------------------------------------------------+
| "msg" | This is a string that contains a message that |
| | should be displayed to the user. |
+----------+--------------------------------------------------------+
| "ctrl" | This is a control string that can tell a client that |
| | it is ignored (to make the user aware of that) and |
| | it can also tell a client that it is no longer ignored.|
| | These notifications are encoded as the strings: |
| | "ignored" and "not ignored". |
| | Any unrecognized strings should be ignored. |
+----------+--------------------------------------------------------+
.. The payload in the packet is a bencoded dictionary with any
.. combination of the following entries:
.. +----------+--------------------------------------------------------+
| "msg" | This is a string that contains a message that |
| | should be displayed to the user. |
+----------+--------------------------------------------------------+
| "ctrl" | This is a control string that can tell a client that |
| | it is ignored (to make the user aware of that) and |
| | it can also tell a client that it is no longer ignored.|
| | These notifications are encoded as the strings: |
| | "ignored" and "not ignored". |
| | Any unrecognized strings should be ignored. |
+----------+--------------------------------------------------------+

View File

@ -64,8 +64,6 @@ POSSIBILITY OF SUCH DAMAGE.
# include <eh.h>
#endif
// TODO: if we're a seed and the peer is a seed, close the connections
namespace libtorrent
{
@ -238,6 +236,7 @@ namespace libtorrent
void set_upload_rate_limit(int bytes_per_second);
// TODO: add a session_status that contain
// some indication of if the listen-port works
std::auto_ptr<alert> pop_alert();
void set_severity_level(alert::severity_t s);

View File

@ -318,10 +318,7 @@ namespace libtorrent
// from the tracker
int m_duration;
// TODO: this should be a map, mapping address
// to peer_connection*
std::map<address, peer_connection*> m_connections;
// std::vector<peer_connection*> m_connections;
// this is the upload and download statistics for the whole torrent.
// it's updated from all its peers once every second.

View File

@ -94,7 +94,7 @@ namespace libtorrent
ret.id[1] = 0;
++i;
if (id[8] == 45)
if (std::equal(id.begin()+4, id.begin()+8, "----"))
{
if (!std::isdigit(*i)) return boost::optional<fingerprint>();
ret.major_version = *i - '0';

View File

@ -230,7 +230,8 @@ namespace libtorrent
, m_send_buffer.begin() + pos + 8
, 0);
// indicate that we support the extension protocol
m_send_buffer[pos] = 0x80;
// curently disabled
// m_send_buffer[pos] = 0x80;
pos += 8;
// info hash
@ -1287,10 +1288,11 @@ namespace libtorrent
// TODO: if the protocol is to be extended
// these 8 bytes would be used to describe the
// extensions available on the other side
if (m_recv_buffer[0] & 0x80)
{
m_supports_extensions = true;
}
// currently disabled
// if (m_recv_buffer[0] & 0x80)
// {
// m_supports_extensions = true;
// }
if (m_torrent == 0)
{

View File

@ -365,6 +365,11 @@ namespace libtorrent
, old_disconnected_peer())
, m_peers.end());
// if the share ratio is 0 (infinite)
// m_available_free_upload isn't used
// because it isn't necessary
if (m_torrent->ratio() != 0.f)
{
// accumulate all the free download we get
// and add it to the available free upload
m_available_free_upload
@ -377,7 +382,7 @@ namespace libtorrent
m_torrent->begin()
, m_torrent->end()
, m_available_free_upload);
}
if (m_torrent->is_seed())
{
@ -652,7 +657,15 @@ namespace libtorrent
--m_num_unchoked;
unchoke_one_peer();
}
// if the share ratio is 0 (infinite), the
// m_available_free_upload isn't used,
// because it isn't necessary.
if (m_torrent->ratio() != 0.f)
{
assert(i->connection->share_diff() < std::numeric_limits<int>::max());
m_available_free_upload += i->connection->share_diff();
}
i->connection = 0;
}

View File

@ -420,7 +420,31 @@ namespace libtorrent
for (peer_iterator i = m_connections.begin(); i != m_connections.end(); ++i)
i->second->announce_piece(index);
// TODO: if we became a seed, disconnect from all other seeds
// if we became a seed, disconnect from all other seeds
if (is_seed())
{
for (peer_iterator i = m_connections.begin();
i != m_connections.end();)
{
assert(i->second->associated_torrent() == this);
if (!i->second->is_seed()) continue;
detail::session_impl::connection_map::iterator j =
m_ses.m_connections.find(i->second->get_socket());
assert(j != m_ses.m_connections.end());
// in the destructor of the peer_connection
// it will remove itself from this torrent
// and from the list we're iterating over.
// so we need to increment the iterator riht
// away.
++i;
m_ses.m_connections.erase(j);
}
}
}
std::string torrent::generate_tracker_request(int port)