Merge branch 'RC_1_1'
This commit is contained in:
commit
967ec412a5
|
@ -93,6 +93,7 @@
|
||||||
|
|
||||||
1.0.9 release
|
1.0.9 release
|
||||||
|
|
||||||
|
* fix issue in checking outgoing interfaces (when that option is enabled)
|
||||||
* python binding fix for boost-1.60.0
|
* python binding fix for boost-1.60.0
|
||||||
* optimize enumeration of network interfaces on windows
|
* optimize enumeration of network interfaces on windows
|
||||||
* improve reliability of binding listen sockets
|
* improve reliability of binding listen sockets
|
||||||
|
|
|
@ -93,6 +93,8 @@ DOCS_PAGES = \
|
||||||
docs/udp_tracker_protocol.rst \
|
docs/udp_tracker_protocol.rst \
|
||||||
docs/utp.rst \
|
docs/utp.rst \
|
||||||
docs/streaming.rst \
|
docs/streaming.rst \
|
||||||
|
docs/tutorial.rst \
|
||||||
|
docs/tutorial.html \
|
||||||
docs/reference-Alerts.html \
|
docs/reference-Alerts.html \
|
||||||
docs/reference-Bdecoding.html \
|
docs/reference-Bdecoding.html \
|
||||||
docs/reference-Bencoding.html \
|
docs/reference-Bencoding.html \
|
||||||
|
|
|
@ -75,7 +75,9 @@ as <tt class="docutils literal">explicit_cache</tt>).</p>
|
||||||
<dd><p class="first last">Finding typos or outdated sections in the documentation. Contributing documentation
|
<dd><p class="first last">Finding typos or outdated sections in the documentation. Contributing documentation
|
||||||
based on your own experience and experimentation with the library or with BitTorrent
|
based on your own experience and experimentation with the library or with BitTorrent
|
||||||
in general. Non-reference documentation is very much welcome as well, higher level
|
in general. Non-reference documentation is very much welcome as well, higher level
|
||||||
descriptions on how to configure libtorrent for various situations for instance.</p>
|
descriptions on how to configure libtorrent for various situations for instance.
|
||||||
|
The reference documentation for libtorrent is generated from the header files.
|
||||||
|
For updates, please submit a <a class="reference external" href="https://github.com/arvidn/libtorrent">pull request</a>.</p>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</li>
|
</li>
|
||||||
|
@ -83,7 +85,8 @@ descriptions on how to configure libtorrent for various situations for instance.
|
||||||
<dt>Code</dt>
|
<dt>Code</dt>
|
||||||
<dd><p class="first">Contributing code for new features or bug-fixes is highly welcome. If you're interested
|
<dd><p class="first">Contributing code for new features or bug-fixes is highly welcome. If you're interested
|
||||||
in adding a feature but not sure where to start, please contact the <a class="reference external" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a> or
|
in adding a feature but not sure where to start, please contact the <a class="reference external" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a> or
|
||||||
<tt class="docutils literal">#libtorrent</tt> @ <tt class="docutils literal">irc.freenode.net</tt>.</p>
|
<tt class="docutils literal">#libtorrent</tt> @ <tt class="docutils literal">irc.freenode.net</tt>. For proposed fixes or udpates, please
|
||||||
|
submit a <a class="reference external" href="https://github.com/arvidn/libtorrent">pull request</a>.</p>
|
||||||
<p class="last">New features might be better support for integrating with other services, new choking
|
<p class="last">New features might be better support for integrating with other services, new choking
|
||||||
algorithms, seeding policies, ports to new platforms etc.</p>
|
algorithms, seeding policies, ports to new platforms etc.</p>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
|
@ -34,11 +34,14 @@ enumerated on this page, please contact arvid@libtorrent.org or the `mailing lis
|
||||||
based on your own experience and experimentation with the library or with BitTorrent
|
based on your own experience and experimentation with the library or with BitTorrent
|
||||||
in general. Non-reference documentation is very much welcome as well, higher level
|
in general. Non-reference documentation is very much welcome as well, higher level
|
||||||
descriptions on how to configure libtorrent for various situations for instance.
|
descriptions on how to configure libtorrent for various situations for instance.
|
||||||
|
The reference documentation for libtorrent is generated from the header files.
|
||||||
|
For updates, please submit a `pull request`_.
|
||||||
|
|
||||||
3. Code
|
3. Code
|
||||||
Contributing code for new features or bug-fixes is highly welcome. If you're interested
|
Contributing code for new features or bug-fixes is highly welcome. If you're interested
|
||||||
in adding a feature but not sure where to start, please contact the `mailing list`_ or
|
in adding a feature but not sure where to start, please contact the `mailing list`_ or
|
||||||
``#libtorrent`` @ ``irc.freenode.net``.
|
``#libtorrent`` @ ``irc.freenode.net``. For proposed fixes or udpates, please
|
||||||
|
submit a `pull request`_.
|
||||||
|
|
||||||
New features might be better support for integrating with other services, new choking
|
New features might be better support for integrating with other services, new choking
|
||||||
algorithms, seeding policies, ports to new platforms etc.
|
algorithms, seeding policies, ports to new platforms etc.
|
||||||
|
@ -49,5 +52,7 @@ For outstanding things to do, see the `todo list`_.
|
||||||
|
|
||||||
.. _hacking: hacking.html
|
.. _hacking: hacking.html
|
||||||
|
|
||||||
|
.. _`pull request`: https://github.com/arvidn/libtorrent
|
||||||
|
|
||||||
.. _`todo list`: todo.html
|
.. _`todo list`: todo.html
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ the library.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="features">
|
<div class="section" id="features">
|
||||||
<h1>features</h1>
|
<h1>features</h1>
|
||||||
<p>libtorrent is under active development. It is an ongoing project. Its
|
<p>libtorrent is an ongoing project under active development. Its
|
||||||
current state supports and includes the following features:</p>
|
current state supports and includes the following features:</p>
|
||||||
<div class="section" id="extensions">
|
<div class="section" id="extensions">
|
||||||
<h2>extensions</h2>
|
<h2>extensions</h2>
|
||||||
|
@ -113,22 +113,22 @@ ratio rather than downloading the torrent.</li>
|
||||||
<div class="section" id="disk-management">
|
<div class="section" id="disk-management">
|
||||||
<h2>disk management</h2>
|
<h2>disk management</h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>uses a separate disk I/O thread to not have the disk ever block on network or
|
<li>can use multipled disk I/O threads to not have the disk block network or
|
||||||
client interaction. (see <a class="reference external" href="manualref.html#threads">threads</a>).</li>
|
client interaction.</li>
|
||||||
<li>uses asynchronous disk I/O when available (overlapped I/O, kaio, and posix-aio)
|
<li>supports verifying the SHA-1 hash of pieces in multiple threads, to take
|
||||||
to make optimal use of disk bandwidth capacity</li>
|
|
||||||
<li>supports verifying the SHA-1 hash of pieces in multiple threads, to take full
|
|
||||||
advantage of multi core machines.</li>
|
advantage of multi core machines.</li>
|
||||||
<li>supports files > 2 gigabytes.</li>
|
<li>supports files > 2 gigabytes.</li>
|
||||||
<li>fast resume support, a way to get rid of the costly piece check at the
|
<li>fast resume support, a way to avoid the costly piece check at the
|
||||||
start of a resumed torrent. Saves the storage state, piece_picker state
|
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>
|
as well as all local peers in a fast-resume file.</li>
|
||||||
<li>has an adjustable read and write disk cache for improved disk throughput.</li>
|
<li>has an adjustable read and write disk cache for improved disk throughput.</li>
|
||||||
<li>queues torrents for file check, instead of checking all of them in parallel.</li>
|
<li>queues torrents for file check, instead of checking all of them in parallel.</li>
|
||||||
<li>does not have any requirements on the piece order in a torrent that it
|
<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>
|
resumes. This means it can resume a torrent downloaded by any client.</li>
|
||||||
<li>seed mode, where the files on disk are assumed to be complete, and each
|
<li>seed mode, where the files on disk are assumed to be complete, and each
|
||||||
piece's hash is verified the first time it is requested.</li>
|
piece's hash is verified the first time it is requested.</li>
|
||||||
|
<li>implements an ARC disk cache, tuned for performing well under bittorrent work
|
||||||
|
loads</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="network">
|
<div class="section" id="network">
|
||||||
|
|
|
@ -21,7 +21,7 @@ the library.
|
||||||
features
|
features
|
||||||
========
|
========
|
||||||
|
|
||||||
libtorrent is under active development. It is an ongoing project. Its
|
libtorrent is an ongoing project under active development. Its
|
||||||
current state supports and includes the following features:
|
current state supports and includes the following features:
|
||||||
|
|
||||||
extensions
|
extensions
|
||||||
|
@ -59,24 +59,22 @@ extensions
|
||||||
disk management
|
disk management
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
* uses a separate disk I/O thread to not have the disk ever block on network or
|
* can use multipled disk I/O threads to not have the disk block network or
|
||||||
client interaction. (see threads_).
|
client interaction.
|
||||||
* uses asynchronous disk I/O when available (overlapped I/O, kaio, and posix-aio)
|
* supports verifying the SHA-1 hash of pieces in multiple threads, to take
|
||||||
to make optimal use of disk bandwidth capacity
|
|
||||||
* supports verifying the SHA-1 hash of pieces in multiple threads, to take full
|
|
||||||
advantage of multi core machines.
|
advantage of multi core machines.
|
||||||
* supports files > 2 gigabytes.
|
* supports files > 2 gigabytes.
|
||||||
* fast resume support, a way to get rid of the costly piece check at the
|
* fast resume support, a way to avoid the costly piece check at the
|
||||||
start of a resumed torrent. Saves the storage state, piece_picker state
|
start of a resumed torrent. Saves the storage state, piece_picker state
|
||||||
as well as all local peers in a separate fast-resume file.
|
as well as all local peers in a fast-resume file.
|
||||||
* has an adjustable read and write disk cache for improved disk throughput.
|
* has an adjustable read and write disk cache for improved disk throughput.
|
||||||
* queues torrents for file check, instead of checking all of them in parallel.
|
* queues torrents for file check, instead of checking all of them in parallel.
|
||||||
* does not have any requirements on the piece order in a torrent that it
|
* 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.
|
resumes. This means it can resume a torrent downloaded by any client.
|
||||||
* seed mode, where the files on disk are assumed to be complete, and each
|
* seed mode, where the files on disk are assumed to be complete, and each
|
||||||
piece's hash is verified the first time it is requested.
|
piece's hash is verified the first time it is requested.
|
||||||
|
* implements an ARC disk cache, tuned for performing well under bittorrent work
|
||||||
.. _threads: manualref.html#threads
|
loads
|
||||||
|
|
||||||
network
|
network
|
||||||
-------
|
-------
|
||||||
|
|
|
@ -6,25 +6,25 @@
|
||||||
| "torrent_handle" +--------+ | |
|
| "torrent_handle" +--------+ | |
|
||||||
+---------------------+ "weak" | +--------------+ |
|
+---------------------+ "weak" | +--------------+ |
|
||||||
| | | "m_connections[]"
|
| | | "m_connections[]"
|
||||||
| | +-------------+----+
|
| | +-------------+ +--+
|
||||||
| | | |
|
| | | | |
|
||||||
"m_picker" v v | v "peers we are connected to"
|
"m_picker" v v | v v "peers we are connected to"
|
||||||
+----------------+ +----------++ +-------------------+
|
+----------------+ +----------++ +-------------------+
|
||||||
| "piece_picker" |<---+-+ "torrent" ++ +--+ "peer_connection" ++
|
| "piece_picker" |<---+-+ "torrent" ++ +--+ "peer_connection" ++
|
||||||
+----------------+ | ++----------+| | ++------------------+|
|
+----------------+ | ++----------+| | ++------------------+|
|
||||||
"m_torrent_file" | +-----------+ | +-------------------+
|
"m_torrent_file" | +-----------+ | +-------------------+
|
||||||
+-------------------+ | |
|
+-------------------+ | |
|
||||||
| "torrent_info" |<---+ | "m_socket"
|
| "torrent_info" |<---+ | "m_socket"
|
||||||
+-------------------+ | | +----------------------------+
|
+-------------------+ | | +----------------------------+
|
||||||
| +->| "socket_type (variant)" |
|
| +->| "socket_type (variant)" |
|
||||||
"m_peer_list" v | | "(TCP/uTP/SSL/socks5/...)" |
|
"m_peer_list" v | | "(TCP/uTP/SSL/socks5/...)" |
|
||||||
+--------------+ | +----------------------------+
|
+--------------+ | +----------------------------+
|
||||||
| "peer_list" | |
|
| "peer_list" | |
|
||||||
+------------+-+ | "m_peer_info"
|
+------------+-+ | "m_peer_info"
|
||||||
"list of all" | "m_peers[]" | "contains contact information"
|
"list of all" | "m_peers[]" | "contains contact information"
|
||||||
"peers we" | | "for peers we're not necessarily"
|
"peers we" | | "for peers we're not necessarily"
|
||||||
"know of" | v "connected to"
|
"know of" | v "connected to"
|
||||||
| +----------------+
|
| +----------------+
|
||||||
+---->| "torrent_peer" ++
|
+---->| "torrent_peer" ++
|
||||||
++---------------+|
|
++---------------+|
|
||||||
+----------------+
|
+----------------+
|
||||||
|
|
|
@ -47,14 +47,13 @@
|
||||||
</table>
|
</table>
|
||||||
<div id="librarySidebar"><ul class="simple">
|
<div id="librarySidebar"><ul class="simple">
|
||||||
<li><a class="reference external" href="https://github.com/arvidn/libtorrent/releases">download</a></li>
|
<li><a class="reference external" href="https://github.com/arvidn/libtorrent/releases">download</a></li>
|
||||||
<li><a class="reference external" href="https://sourceforge.net/projects/libtorrent/files/py-libtorrent/">download python binding</a></li>
|
|
||||||
<li><a class="reference external" href="features.html">features</a></li>
|
<li><a class="reference external" href="features.html">features</a></li>
|
||||||
<li><a class="reference external" href="contributing.html">contributing</a></li>
|
|
||||||
<li><a class="reference external" href="building.html">building libtorrent</a></li>
|
|
||||||
<li><a class="reference external" href="examples.html">examples</a></li>
|
<li><a class="reference external" href="examples.html">examples</a></li>
|
||||||
<li><a class="reference external" href="manual-ref.html">library overview</a></li>
|
<li><a class="reference external" href="manual-ref.html">overview</a></li>
|
||||||
<li><a class="reference external" href="reference.html">reference documentation</a></li>
|
<li><a class="reference external" href="reference.html">reference documentation</a></li>
|
||||||
<li><a class="reference external" href="troubleshooting.html">troubleshooting issues</a></li>
|
<li><a class="reference external" href="contributing.html">contributing</a></li>
|
||||||
|
<li><a class="reference external" href="building.html">building</a></li>
|
||||||
|
<li><a class="reference external" href="troubleshooting.html">troubleshooting</a></li>
|
||||||
<li><a class="reference external" href="tuning.html">tuning</a></li>
|
<li><a class="reference external" href="tuning.html">tuning</a></li>
|
||||||
<li><a class="reference external" href="client_test.png">screenshot</a></li>
|
<li><a class="reference external" href="client_test.png">screenshot</a></li>
|
||||||
<li><a class="reference external" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a> (<a class="reference external" href="http://dir.gmane.org/gmane.network.bit-torrent.libtorrent">archive</a>)</li>
|
<li><a class="reference external" href="http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss">mailing list</a> (<a class="reference external" href="http://dir.gmane.org/gmane.network.bit-torrent.libtorrent">archive</a>)</li>
|
||||||
|
@ -125,8 +124,8 @@ list or posted to the <a class="reference external" href="https://github.com/arv
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="acknowledgements">
|
<div class="section" id="acknowledgements">
|
||||||
<h2>Acknowledgements</h2>
|
<h2>Acknowledgements</h2>
|
||||||
<p>Written by Arvid Norberg. Copyright © 2003-2015</p>
|
<p>Written by Arvid Norberg. Copyright © 2003-2016</p>
|
||||||
<p>Contributions by Magnus Jonsson, Daniel Wallin and Cory Nelson</p>
|
<p>Contributions by Steven Siloti, Magnus Jonsson, Daniel Wallin and Cory Nelson</p>
|
||||||
<p>Thanks to Reimond Retz for bugfixes, suggestions and testing</p>
|
<p>Thanks to Reimond Retz for bugfixes, suggestions and testing</p>
|
||||||
<p>Thanks to <a class="reference external" href="http://www.cs.umu.se">Umeå University</a> for providing development and test hardware.</p>
|
<p>Thanks to <a class="reference external" href="http://www.cs.umu.se">Umeå University</a> for providing development and test hardware.</p>
|
||||||
<p>Project is hosted by <a class="reference external" href="https://www.github.com/arvidn/libtorrent">github</a>.</p>
|
<p>Project is hosted by <a class="reference external" href="https://www.github.com/arvidn/libtorrent">github</a>.</p>
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
<div id="librarySidebar">
|
<div id="librarySidebar">
|
||||||
|
|
||||||
* download_
|
* download_
|
||||||
* `download python binding`_
|
|
||||||
* features_
|
* features_
|
||||||
* contributing_
|
* tutorial_
|
||||||
* `building libtorrent`_
|
|
||||||
* examples_
|
* examples_
|
||||||
* `library overview`_
|
* overview_
|
||||||
* `reference documentation`_
|
* `reference documentation`_
|
||||||
* `troubleshooting issues`_
|
* contributing_
|
||||||
|
* building_
|
||||||
|
* troubleshooting_
|
||||||
* `tuning`_
|
* `tuning`_
|
||||||
* screenshot_
|
* screenshot_
|
||||||
* `mailing list`_ (archive_)
|
* `mailing list`_ (archive_)
|
||||||
|
@ -58,14 +58,14 @@ libtorrent
|
||||||
==========
|
==========
|
||||||
|
|
||||||
.. _download: https://github.com/arvidn/libtorrent/releases
|
.. _download: https://github.com/arvidn/libtorrent/releases
|
||||||
.. _`download python binding`: https://sourceforge.net/projects/libtorrent/files/py-libtorrent/
|
|
||||||
.. _features: features.html
|
.. _features: features.html
|
||||||
|
.. _tutorial: tutorial.html
|
||||||
.. _contributing: contributing.html
|
.. _contributing: contributing.html
|
||||||
.. _`building libtorrent`: building.html
|
.. _building: building.html
|
||||||
.. _examples: examples.html
|
.. _examples: examples.html
|
||||||
.. _`library overview`: manual-ref.html
|
.. _overview: manual-ref.html
|
||||||
.. _`reference documentation`: reference.html
|
.. _`reference documentation`: reference.html
|
||||||
.. _`troubleshooting issues`: troubleshooting.html
|
.. _troubleshooting: troubleshooting.html
|
||||||
.. _`tuning`: tuning.html
|
.. _`tuning`: tuning.html
|
||||||
.. _screenshot: client_test.png
|
.. _screenshot: client_test.png
|
||||||
.. _`uTP`: utp.html
|
.. _`uTP`: utp.html
|
||||||
|
@ -104,7 +104,6 @@ The main goals of libtorrent are:
|
||||||
* to be memory efficient
|
* to be memory efficient
|
||||||
* to be very easy to use
|
* to be very easy to use
|
||||||
|
|
||||||
|
|
||||||
Donate
|
Donate
|
||||||
======
|
======
|
||||||
|
|
||||||
|
@ -147,9 +146,9 @@ list or posted to the `bug tracker`_.
|
||||||
Acknowledgements
|
Acknowledgements
|
||||||
================
|
================
|
||||||
|
|
||||||
Written by Arvid Norberg. Copyright |copy| 2003-2015
|
Written by Arvid Norberg. Copyright |copy| 2003-2016
|
||||||
|
|
||||||
Contributions by Magnus Jonsson, Daniel Wallin and Cory Nelson
|
Contributions by Steven Siloti, Magnus Jonsson, Daniel Wallin and Cory Nelson
|
||||||
|
|
||||||
Thanks to Reimond Retz for bugfixes, suggestions and testing
|
Thanks to Reimond Retz for bugfixes, suggestions and testing
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ TARGETS = index \
|
||||||
tuning \
|
tuning \
|
||||||
hacking \
|
hacking \
|
||||||
streaming \
|
streaming \
|
||||||
|
tutorial \
|
||||||
$(REFERENCE_TARGETS)
|
$(REFERENCE_TARGETS)
|
||||||
|
|
||||||
FIGURES = \
|
FIGURES = \
|
||||||
|
|
|
@ -37,7 +37,10 @@ The basic usage is as follows:
|
||||||
* save session state (see save_state())
|
* save session state (see save_state())
|
||||||
* destruct session object
|
* destruct session object
|
||||||
|
|
||||||
Each class and function is described in this manual.
|
Each class and function is described in this manual, you may want to have a
|
||||||
|
look at the tutorial_ as well.
|
||||||
|
|
||||||
|
.. _tutorial: tutorial.html
|
||||||
|
|
||||||
For a description on how to create torrent files, see create_torrent.
|
For a description on how to create torrent files, see create_torrent.
|
||||||
|
|
||||||
|
|
|
@ -349,8 +349,8 @@ unchoking</h2><h4>../src/session_impl.cpp:4105</h4><pre style="background: #f6f6
|
||||||
if (pi && pi->optimistically_unchoked)
|
if (pi && pi->optimistically_unchoked)
|
||||||
{
|
{
|
||||||
m_stats_counters.inc_stats_counter(counters::num_peers_up_unchoked_optimistic, -1);
|
m_stats_counters.inc_stats_counter(counters::num_peers_up_unchoked_optimistic, -1);
|
||||||
</pre></td></tr><tr style="background: #fcc"><td>relevance 3</td><td><a href="javascript:expand(7)">../src/torrent.cpp:9593</a></td><td>this really needs to be moved to do_async_save_resume_data. flags need to be passed on</td></tr><tr id="7" style="display: none;" colspan="3"><td colspan="3"><h2>this really needs to be moved to do_async_save_resume_data.
|
</pre></td></tr><tr style="background: #fcc"><td>relevance 3</td><td><a href="javascript:expand(7)">../src/torrent.cpp:9611</a></td><td>this really needs to be moved to do_async_save_resume_data. flags need to be passed on</td></tr><tr id="7" style="display: none;" colspan="3"><td colspan="3"><h2>this really needs to be moved to do_async_save_resume_data.
|
||||||
flags need to be passed on</h2><h4>../src/torrent.cpp:9593</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> alerts().emplace_alert<save_resume_data_failed_alert>(get_handle()
|
flags need to be passed on</h2><h4>../src/torrent.cpp:9611</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> alerts().emplace_alert<save_resume_data_failed_alert>(get_handle()
|
||||||
, m_error);
|
, m_error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2579,9 +2579,9 @@ session host resolver interface</h2><h4>../src/torrent.cpp:4941</h4><pre style="
|
||||||
// disable super seeding for all peers
|
// disable super seeding for all peers
|
||||||
for (peer_iterator i = begin(); i != end(); ++i)
|
for (peer_iterator i = begin(); i != end(); ++i)
|
||||||
{
|
{
|
||||||
</pre></td></tr><tr style="background: #cfc"><td>relevance 2</td><td><a href="javascript:expand(52)">../src/torrent.cpp:8109</a></td><td>if peer is a really good peer, maybe we shouldn't disconnect it perhaps this logic should be disabled if we have too many idle peers (with some definition of idle)</td></tr><tr id="52" style="display: none;" colspan="3"><td colspan="3"><h2>if peer is a really good peer, maybe we shouldn't disconnect it
|
</pre></td></tr><tr style="background: #cfc"><td>relevance 2</td><td><a href="javascript:expand(52)">../src/torrent.cpp:8127</a></td><td>if peer is a really good peer, maybe we shouldn't disconnect it perhaps this logic should be disabled if we have too many idle peers (with some definition of idle)</td></tr><tr id="52" style="display: none;" colspan="3"><td colspan="3"><h2>if peer is a really good peer, maybe we shouldn't disconnect it
|
||||||
perhaps this logic should be disabled if we have too many idle peers
|
perhaps this logic should be disabled if we have too many idle peers
|
||||||
(with some definition of idle)</h2><h4>../src/torrent.cpp:8109</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;">#ifndef TORRENT_DISABLE_LOGGING
|
(with some definition of idle)</h2><h4>../src/torrent.cpp:8127</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;">#ifndef TORRENT_DISABLE_LOGGING
|
||||||
debug_log("incoming peer (%d)", int(m_connections.size()));
|
debug_log("incoming peer (%d)", int(m_connections.size()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -4341,9 +4341,9 @@ it may pose an issue when downgrading though</h2><h4>../src/torrent.cpp:7227</h4
|
||||||
|
|
||||||
// write have bitmask
|
// write have bitmask
|
||||||
// the pieces string has one byte per piece. Each
|
// the pieces string has one byte per piece. Each
|
||||||
</pre></td></tr><tr style="background: #ccf"><td>relevance 1</td><td><a href="javascript:expand(87)">../src/torrent.cpp:8453</a></td><td>should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though</td></tr><tr id="87" style="display: none;" colspan="3"><td colspan="3"><h2>should disconnect all peers that have the pieces we have
|
</pre></td></tr><tr style="background: #ccf"><td>relevance 1</td><td><a href="javascript:expand(87)">../src/torrent.cpp:8471</a></td><td>should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though</td></tr><tr id="87" style="display: none;" colspan="3"><td colspan="3"><h2>should disconnect all peers that have the pieces we have
|
||||||
not just seeds. It would be pretty expensive to check all pieces
|
not just seeds. It would be pretty expensive to check all pieces
|
||||||
for all peers though</h2><h4>../src/torrent.cpp:8453</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;">
|
for all peers though</h2><h4>../src/torrent.cpp:8471</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;">
|
||||||
set_state(torrent_status::finished);
|
set_state(torrent_status::finished);
|
||||||
set_queue_position(-1);
|
set_queue_position(-1);
|
||||||
|
|
||||||
|
@ -8392,25 +8392,25 @@ no one uses merkle torrents</h2><h4>../src/torrent.cpp:7059</h4><pre style="back
|
||||||
if (piece_priority && piece_priority.string_length()
|
if (piece_priority && piece_priority.string_length()
|
||||||
== m_torrent_file->num_pieces())
|
== m_torrent_file->num_pieces())
|
||||||
{
|
{
|
||||||
</pre></td></tr><tr style="background: #ccc"><td>relevance 0</td><td><a href="javascript:expand(222)">../src/torrent.cpp:7285</a></td><td>make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance. using file_base</td></tr><tr id="222" style="display: none;" colspan="3"><td colspan="3"><h2>make this more generic to not just work if files have been
|
</pre></td></tr><tr style="background: #ccc"><td>relevance 0</td><td><a href="javascript:expand(222)">../src/torrent.cpp:7303</a></td><td>make this more generic to not just work if files have been renamed, but also if they have been merged into a single file for instance. using file_base</td></tr><tr id="222" style="display: none;" colspan="3"><td colspan="3"><h2>make this more generic to not just work if files have been
|
||||||
renamed, but also if they have been merged into a single file for instance.
|
renamed, but also if they have been merged into a single file for instance.
|
||||||
using file_base</h2><h4>../src/torrent.cpp:7285</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> pieces.resize(m_torrent_file->num_pieces());
|
using file_base</h2><h4>../src/torrent.cpp:7303</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> if (!has_picker())
|
||||||
if (!has_picker())
|
{
|
||||||
{
|
std::memset(&pieces[0], m_have_all, pieces.size());
|
||||||
std::memset(&pieces[0], m_have_all, pieces.size());
|
}
|
||||||
}
|
else if (has_picker())
|
||||||
else if (has_picker())
|
{
|
||||||
{
|
for (int i = 0, end(pieces.size()); i < end; ++i)
|
||||||
for (int i = 0, end(pieces.size()); i < end; ++i)
|
pieces[i] = m_picker->have_piece(i) ? 1 : 0;
|
||||||
pieces[i] = m_picker->have_piece(i) ? 1 : 0;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (m_seed_mode)
|
if (m_seed_mode)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(m_verified.size() == pieces.size());
|
TORRENT_ASSERT(m_verified.size() == pieces.size());
|
||||||
TORRENT_ASSERT(m_verifying.size() == pieces.size());
|
TORRENT_ASSERT(m_verifying.size() == pieces.size());
|
||||||
for (int i = 0, end(pieces.size()); i < end; ++i)
|
for (int i = 0, end(pieces.size()); i < end; ++i)
|
||||||
pieces[i] |= m_verified[i] ? 2 : 0;
|
pieces[i] |= m_verified[i] ? 2 : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// write renamed files
|
// write renamed files
|
||||||
|
@ -8445,9 +8445,9 @@ using file_base</h2><h4>../src/torrent.cpp:7285</h4><pre style="background: #f6f
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
torrent_peer const* p = *i;
|
torrent_peer const* p = *i;
|
||||||
</pre></td></tr><tr style="background: #ccc"><td>relevance 0</td><td><a href="javascript:expand(223)">../src/torrent.cpp:9541</a></td><td>add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file</td></tr><tr id="223" style="display: none;" colspan="3"><td colspan="3"><h2>add a flag to ignore stats, and only care about resume data for
|
</pre></td></tr><tr style="background: #ccc"><td>relevance 0</td><td><a href="javascript:expand(223)">../src/torrent.cpp:9559</a></td><td>add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file</td></tr><tr id="223" style="display: none;" colspan="3"><td colspan="3"><h2>add a flag to ignore stats, and only care about resume data for
|
||||||
content. For unchanged files, don't trigger a load of the metadata
|
content. For unchanged files, don't trigger a load of the metadata
|
||||||
just to save an empty resume data file</h2><h4>../src/torrent.cpp:9541</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> if (m_complete != 0xffffff) seeds = m_complete;
|
just to save an empty resume data file</h2><h4>../src/torrent.cpp:9559</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> if (m_complete != 0xffffff) seeds = m_complete;
|
||||||
else seeds = m_peer_list ? m_peer_list->num_seeds() : 0;
|
else seeds = m_peer_list ? m_peer_list->num_seeds() : 0;
|
||||||
|
|
||||||
if (m_incomplete != 0xffffff) downloaders = m_incomplete;
|
if (m_incomplete != 0xffffff) downloaders = m_incomplete;
|
||||||
|
@ -8466,7 +8466,7 @@ just to save an empty resume data file</h2><h4>../src/torrent.cpp:9541</h4><pre
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is an async operation triggered by the client
|
// this is an async operation triggered by the client
|
||||||
<div style="background: #ffff00" width="100%"> void torrent::save_resume_data(int flags)
|
<div style="background: #ffff00" width="100%"> void torrent::save_resume_data(int flags)
|
||||||
</div> {
|
</div> {
|
||||||
TORRENT_ASSERT(is_single_thread());
|
TORRENT_ASSERT(is_single_thread());
|
||||||
|
@ -8498,8 +8498,8 @@ just to save an empty resume data file</h2><h4>../src/torrent.cpp:9541</h4><pre
|
||||||
{
|
{
|
||||||
alerts().emplace_alert<save_resume_data_failed_alert>(get_handle()
|
alerts().emplace_alert<save_resume_data_failed_alert>(get_handle()
|
||||||
, m_error);
|
, m_error);
|
||||||
</pre></td></tr><tr style="background: #ccc"><td>relevance 0</td><td><a href="javascript:expand(224)">../src/torrent.cpp:11168</a></td><td>instead of resorting the whole list, insert the peers directly into the right place</td></tr><tr id="224" style="display: none;" colspan="3"><td colspan="3"><h2>instead of resorting the whole list, insert the peers
|
</pre></td></tr><tr style="background: #ccc"><td>relevance 0</td><td><a href="javascript:expand(224)">../src/torrent.cpp:11186</a></td><td>instead of resorting the whole list, insert the peers directly into the right place</td></tr><tr id="224" style="display: none;" colspan="3"><td colspan="3"><h2>instead of resorting the whole list, insert the peers
|
||||||
directly into the right place</h2><h4>../src/torrent.cpp:11168</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> printf("timed out [average-piece-time: %d ms ]\n"
|
directly into the right place</h2><h4>../src/torrent.cpp:11186</h4><pre style="background: #f6f6f6; border: solid 1px #ddd;"> printf("timed out [average-piece-time: %d ms ]\n"
|
||||||
, m_average_piece_time);
|
, m_average_piece_time);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
=================
|
||||||
|
libtorrent manual
|
||||||
|
=================
|
||||||
|
|
||||||
|
:Author: Arvid Norberg, arvid@libtorrent.org
|
||||||
|
:Version: 1.1.0
|
||||||
|
|
||||||
|
.. contents:: Table of contents
|
||||||
|
:depth: 2
|
||||||
|
:backlinks: none
|
||||||
|
|
||||||
|
tutorial
|
||||||
|
========
|
||||||
|
|
||||||
|
The fundamental feature of starting and downloading torrents in libtorrent is
|
||||||
|
achieved by creating a *session*, which provides the context and a container for
|
||||||
|
torrents. This is done with via the session_ class, most of its interface is
|
||||||
|
documented under session_handle_ though.
|
||||||
|
|
||||||
|
To add a torrent to the session, you fill in an add_torrent_params_ object and
|
||||||
|
pass it either to `add_torrent()`_ or `async_add_torrent()`_.
|
||||||
|
|
||||||
|
``add_torrent()`` is a blocking call which returns a torrent_handle_.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
.. code:: c++
|
||||||
|
|
||||||
|
#include <libtorrent/session.hpp>
|
||||||
|
#include <libtorrent/add_torrent_params.hpp>
|
||||||
|
#include <libtorrent/torrent_handle.hpp>
|
||||||
|
|
||||||
|
namespace lt = libtorrent;
|
||||||
|
int main(int argc, char const* argv[])
|
||||||
|
{
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "usage: %s <magnet-url>\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
lt::session ses;
|
||||||
|
|
||||||
|
lt::add_torrent_params atp;
|
||||||
|
atp.url = argv[1];
|
||||||
|
atp.save_path = "."; // save in current dir
|
||||||
|
lt::torrent_handle h = ses.add_torrent(atp);
|
||||||
|
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
Once you have a torrent_handle_, you can affect it as well as querying status.
|
||||||
|
First, let's extend the example to print out messages from the bittorrent engine
|
||||||
|
about progress and events happening under the hood. libtorrent has a mechanism
|
||||||
|
referred to as *alerts* to communicate back information to the client application.
|
||||||
|
|
||||||
|
Clients can poll libtorrents for new alerts via the `pop_alerts()`_ call on the
|
||||||
|
session object. This call fills in a vector of alert pointers with all new
|
||||||
|
alerts since the last call to this function. The pointers are owned by the
|
||||||
|
session object at will become invalidated by the next call to `pop_alerts()`_.
|
||||||
|
|
||||||
|
The alerts form a class hierarchy with alert_ as the root class. Each specific
|
||||||
|
kind of alert may include additional state, specific to the kind of message. All
|
||||||
|
alerts implement a message() function that prints out pertinent information
|
||||||
|
of the alert message. This can be convenient for simply logging events.
|
||||||
|
|
||||||
|
For programatically react to certain events, use `alert_cast<>`_ to attempt
|
||||||
|
a down cast of an alert object to a more specific type.
|
||||||
|
|
||||||
|
In order to print out events from libtorrent as well as exiting when the torrent
|
||||||
|
completes downloading, we can poll the session for alerts periodically and print
|
||||||
|
them out, as well as listening for the torrent_finished_alert_, which is posted
|
||||||
|
when a torrent completes.
|
||||||
|
|
||||||
|
.. code:: c++
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <libtorrent/session.hpp>
|
||||||
|
#include <libtorrent/add_torrent_params.hpp>
|
||||||
|
#include <libtorrent/torrent_handle.hpp>
|
||||||
|
#include <libtorrent/alert_types.hpp>
|
||||||
|
|
||||||
|
namespace lt = libtorrent;
|
||||||
|
int main(int argc, char const* argv[])
|
||||||
|
{
|
||||||
|
if (argc != 2) {
|
||||||
|
std::cerr << "usage: " << argv[0] << " <magnet-url>" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
lt::session ses;
|
||||||
|
|
||||||
|
lt::add_torrent_params atp;
|
||||||
|
atp.url = argv[1];
|
||||||
|
atp.save_path = "."; // save in current dir
|
||||||
|
lt::torrent_handle h = ses.add_torrent(atp);
|
||||||
|
|
||||||
|
bool done = false;
|
||||||
|
while (!done) {
|
||||||
|
std::vector<lt::alert*> alerts;
|
||||||
|
ses.pop_alerts(&alerts);
|
||||||
|
|
||||||
|
for (lt::alert const* a : alerts) {
|
||||||
|
std::cout << a->message() << std::endl;
|
||||||
|
if (lt::alert_cast<lt::torrent_finished_alert>(a)) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*TODO* cover async_add_torrent()
|
||||||
|
*TODO* cover post_torrent_updates()
|
||||||
|
*TODO* cover save_resume_data()
|
||||||
|
|
||||||
|
.. _session: reference-Core.html#session
|
||||||
|
.. _session_handle: reference-Core.html#session_handle
|
||||||
|
.. _add_torrent_params: reference-Core.html#add_torrent_params
|
||||||
|
.. _`add_torrent()`: reference-Core.html#add_torrent()
|
||||||
|
.. _`async_add_torrent()`: reference-Core.html#add_torrent()
|
||||||
|
.. _torrent_handle: reference-Core.html#torrent_handle
|
||||||
|
.. _`pop_alerts()`: reference-Core.html#pop_alerts()
|
||||||
|
.. _`alert`: reference-Alerts.html#alert
|
||||||
|
.. _`alert_cast<>`: reference-Alerts.html#alert_cast()
|
||||||
|
.. _torrent_finished_alert: reference-Alerts.html#torrent-finished-alert
|
||||||
|
|
||||||
|
|
|
@ -310,15 +310,13 @@ namespace libtorrent {
|
||||||
|
|
||||||
// When you get an alert, you can use ``alert_cast<>`` to attempt to cast the pointer to a
|
// When you get an alert, you can use ``alert_cast<>`` to attempt to cast the pointer to a
|
||||||
// more specific alert type, in order to query it for more information.
|
// more specific alert type, in order to query it for more information.
|
||||||
template <class T>
|
template <class T> T* alert_cast(alert* a)
|
||||||
T* alert_cast(alert* a)
|
|
||||||
{
|
{
|
||||||
if (a == 0) return 0;
|
if (a == 0) return 0;
|
||||||
if (a->type() == T::alert_type) return static_cast<T*>(a);
|
if (a->type() == T::alert_type) return static_cast<T*>(a);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
template <class T>
|
template <class T> T const* alert_cast(alert const* a)
|
||||||
T const* alert_cast(alert const* a)
|
|
||||||
{
|
{
|
||||||
if (a == 0) return 0;
|
if (a == 0) return 0;
|
||||||
if (a->type() == T::alert_type) return static_cast<T const*>(a);
|
if (a->type() == T::alert_type) return static_cast<T const*>(a);
|
||||||
|
|
|
@ -6752,9 +6752,6 @@ namespace libtorrent
|
||||||
// bit 0: set if we have the piece
|
// bit 0: set if we have the piece
|
||||||
// bit 1: set if we have verified the piece (in seed mode)
|
// bit 1: set if we have verified the piece (in seed mode)
|
||||||
bool const is_checking = state() == torrent_status::checking_files;
|
bool const is_checking = state() == torrent_status::checking_files;
|
||||||
bool const has_checked = state() == torrent_status::downloading
|
|
||||||
|| state() == torrent_status::finished
|
|
||||||
|| state() == torrent_status::seeding;
|
|
||||||
|
|
||||||
// if we are checking, only save the have_pieces bitfield up to the piece
|
// if we are checking, only save the have_pieces bitfield up to the piece
|
||||||
// we have actually checked. This allows us to resume the checking when we
|
// we have actually checked. This allows us to resume the checking when we
|
||||||
|
@ -6763,7 +6760,7 @@ namespace libtorrent
|
||||||
// bitfield.
|
// bitfield.
|
||||||
int const max_piece
|
int const max_piece
|
||||||
= is_checking ? m_num_checked_pieces
|
= is_checking ? m_num_checked_pieces
|
||||||
: has_checked ? m_torrent_file->num_pieces()
|
: m_files_checked ? m_torrent_file->num_pieces()
|
||||||
: 0;
|
: 0;
|
||||||
|
|
||||||
if (max_piece > 0)
|
if (max_piece > 0)
|
||||||
|
|
|
@ -195,13 +195,13 @@ namespace libtorrent
|
||||||
if (is_any(i->destination) && i->destination.is_v4() == remote.is_v4())
|
if (is_any(i->destination) && i->destination.is_v4() == remote.is_v4())
|
||||||
{
|
{
|
||||||
best = &*i;
|
best = &*i;
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match_addr_mask(remote, i->destination, i->netmask))
|
if (match_addr_mask(remote, i->destination, i->netmask))
|
||||||
{
|
{
|
||||||
best = &*i;
|
best = &*i;
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue