diff --git a/docs/building.html b/docs/building.html new file mode 100644 index 000000000..ff42ea32f --- /dev/null +++ b/docs/building.html @@ -0,0 +1,377 @@ + + + + + + +libtorrent manual + + + + +
+

libtorrent manual

+ +++ + + + +
Author:Arvid Norberg, arvid@rasterbar.com
+
+

Table of contents

+ +
+
+

downloading and building

+

To acquire the latest version of libtorrent, you'll have to grab it from CVS. +You'll find instructions on how to do this here (see Anonymous CVS access).

+

The build systems supported "out of the box" in libtorrent are boost-build v2 +(BBv2) and autotools (for unix-like systems). If you still can't build after +following these instructions, you can usually get help in the #libtorrent +IRC channel on irc.freenode.net.

+
+

building with BBv2

+

The primary reason to use boost-build is that it will automatically build the +dependent boost libraries with the correct compiler settings, in order to +ensure that the build targets are link compatible (see boost guidelines +for some details on this issue).

+

Since BBv2 will build the boost libraries for you, you need the full boost +source package. Having boost installed via some package system is usually not +enough (and even if it is enough, the necessary environment variables are +usually not set by the package installer).

+
+

Step 1: Download boost

+

You'll find boost here.

+

Extract the archive to some directory where you want it. For the sake of this +guide, let's assume you extract the package to c:\boost_1_33_1 (I'm using +a windows path in this example since if you're on linux/unix you're more likely +to use the autotools). You'll need at least version 1.32 of the boost library +in order to build libtorrent.

+

If you use 1.32, you need to download BBv2 separately, so for now, let's +assume you will use version 1.33.1.

+
+
+

Step 2: Setup BBv2

+

First you need to build bjam. You do this by opening a terminal (In +windows, run cmd). Change directory to +c:\boost_1_33_1\tools\build\jam_src. Then run the script called +build.bat or build.sh on a unix system. This will build bjam and +place it in a directory starting with bin. and then have the name of your +platform. Copy the bjam.exe (or bjam on a unix system) to a place +that's in you shell's PATH. On linux systems a place commonly used may be +/usr/local/bin or on windows c:\windows (you can also add directories +to the search paths by modifying the environment variable called PATH).

+

Now you have bjam installed. bjam can be considered an interpreter +that the boost-build system is implemented on. So boost-build uses bjam. +So, to complete the installation you need to make two more things. You need to +set the environment variable BOOST_BUILD_PATH. This is the path that tells +bjam where it can find boost-build, your configuration file and all the +toolsets (descriptions used by boost-build to know how to use different +compilers on different platforms). Assuming the boost install path above, set +it to c:\boost_1_33_1\tools\build\v2.

+

To set an environment variable in windows, type for example:

+
+set BOOST_BUILD_PATH=c:\boost_1_33_1\tools\build\v2
+
+

In a terminal window.

+

The last thing to do to complete the setup of BBv2 is to modify your +user-config.jam file. It is located in c:\boost_1_33_1\tools\build\v2. +Depending on your platform and which compiler you're using, you should add a +line for each compiler and compiler version you have installed on your system +that you want to be able to use with BBv2. For example, if you're using +Microsoft Visual Studio 7.1 (2003), just add a line:

+
+using msvc : 7.1 ;
+
+

If you use GCC, add the line:

+
+using gcc ;
+
+

If you have more than one version of GCC installed, you can add the +commandline used to invoke g++ after the version number, like this:

+
+using gcc : 3.3 : g++-3.3 ;
+using gcc : 4.0 : g++-4.0 ;
+
+

Another toolset worth mentioning is the darwin toolset (For MacOS X). +From Tiger (10.4) MacOS X comes with both GCC 3.3 and GCC 4.0. Then you can +use the following toolsets:

+
+using darwin : 3.3 : g++-3.3 ;
+using darwin : 4.0 : g++-4.0 ;
+
+

Note that the spaces around the semi-colons and colons are important!

+
+
+

Step 3: Building libtorrent

+

When building libtorrent, the Jamfile expects the environment variable +BOOST_ROOT to be set to the boost installation directory. It uses this to +find the boost libraries it depends on, so they can be built and their headers +files found. So, set this to c:\boost_1_33_1.

+

Then the only thing left is simply to invoke bjam. If you want to specify +a specific toolset to use (compiler) you can just add that to the commandline. +For example:

+
+bjam msvc-7.1 link=static
+bjam gcc-3.3 link=static
+bjam darwin-4.0 link=static
+
+

To build different versions you can also just add the name of the build +variant. Some default build variants in BBv2 are release, debug, +profile.

+

You can build libtorrent as a dll too, by typing link=shared, or +link=static to build a static library. link=shared is the default.

+

If you want to explicitly say how to link against the runtime library, you +can set the runtime-link feature on the commandline, either to shared +or static. Most operating systems will only allow linking shared against +the runtime, but on windows you can do both. Example:

+
+bjam msvc-7.1 link=static runtime-link=static
+
+
+

Warning

+

If you link statically to the runtime library, you cannot build libtorrent +as a shared library (DLL), since you will get separate heaps in the library +and in the client application. It will result in crashes.

+
+

The build targets are put in a directory called bin, and under it they are +sorted in directories depending on the toolset and build variant used.

+

To build the examples, just change directory to the examples directory and +invoke bjam from there. To build and run the tests, go to the test +directory and run bjam.

+

Note that if you're building on windows using the msvc toolset, you cannot run it +from a cygwin terminal, you'll have to run it from a cmd terminal. The same goes for +cygwin, if you're building with gcc in cygwin you'll have to run it from a cygwin terminal. +Also, make sure the paths are correct in the different environments. In cygwin, the paths +(BOOST_BUILD_PATH and BOOST_ROOT) should be in the typical unix-format (e.g. +/cygdrive/c/boost_1_33_1). In the windows environment, they should have the typical +windows format (c:/boost_1_33_1).

+

The Jamfile will define NDEBUG when it's building a release build. +There are two other build variants available in the Jamfile. debug_log +and release_log, these two variants inherits from the debug and release +variants respectively, but adds extra logging (TORRENT_VERBOSE_LOGGING). +For more build configuration flags see Build configurations.

+

The Jamfile has the following build variants:

+
    +
  • release - release version without any logging
  • +
  • release_log - release version with standard logging
  • +
  • release_vlog - release version with verbose logging (all peer connections are logged)
  • +
  • debug - debug version without any logging
  • +
  • debug_log - debug version with standard logging
  • +
  • debug_vlog - debug version with verbose logging
  • +
+

The logs created when building vlog or log mode are put in a directory called +libtorrent_logs in the current working directory.

+

When building the example client on windows, you need to build with +link=static otherwise you may get unresolved external symbols for some +boost.program-options symbols.

+

For more information, see the Boost build v2 documentation.

+
+
+
+

building with autotools

+

First of all, you need to install automake and autoconf. Many +unix/linux systems comes with these preinstalled.

+
+

Step 1: Generating the build system

+

No build system is present if libtorrent is checked out from CVS - it +needs to be generated first. If you're building from a released tarball, +you may skip directly to Step 2: Running configure.

+

Execute the following commands, in the given order, to generate +the build system:

+
    +
  • aclocal -I m4
  • +
  • autoheader
  • +
  • libtoolize --copy --force
  • +
  • automake --add-missing --copy --gnu
  • +
  • autoconf
  • +
+
+
+

Step 2: Running configure

+

In your shell, change directory to the libtorrent directory and run +./configure. This will look for libraries and C++ features that libtorrent +is dependent on. If something is missing or can't be found it will print an +error telling you what failed.

+

The most likely problem you may encounter is that the configure script won't +find the boost libraries. Make sure you have boost installed on your system. +The easiest way to install boost is usually to use the preferred package +system on your platform. Usually libraries and headers are installed in +standard directories where the compiler will find them, but sometimes that +may not be the case. For example when installing boost on darwin using +darwinports (the package system based on BSD ports) all libraries are +installed to /opt/local/lib and headers are installed to +/opt/local/include. By default the compiler will not look in these +directories. You have to set the enviornment variables LDFLAGS and +CXXFLAGS in order to make the compiler find those libs. In this example +you'd set them like this:

+
+export LDFLAGS=-L/opt/local/lib
+export CXXFLAGS=-I/opt/local/include
+
+

It was observed on FreeBSD (release 6.0) that one needs to add '-lpthread' to +LDFLAGS, as Boost::Thread detection will fail without it, even if +Boost::Thread is installed.

+

If you need to set these variables, it may be a good idea to add those lines +to your ~/.profile or ~/.tcshrc depending on your shell.

+

You know that the boost libraries were found if you see the following output +from the configure script:

+
+checking whether the Boost::DateTime library is available... yes
+checking for main in -lboost_date_time... yes
+checking whether the Boost::Filesystem library is available... yes
+checking for main in -lboost_filesystem... yes
+checking whether the Boost::Thread library is available... yes
+checking for main in -lboost_thread... yes
+
+

Another possible source of problems may be if the path to your libtorrent +directory contains spaces. Make sure you either rename the directories with +spaces in their names to remove the spaces or move the libtorrent directory.

+
+
+

Creating a debug build

+

To tell configure to build a debug version (with debug info, asserts +and invariant checks enabled), you have to run the configure script +with the following option:

+
+./configure --enable-debug=yes
+
+
+
+

Creating a release build

+

To tell the configure to build a release version (without debug info, +asserts and invariant checks), you have to run the configure script +with the following option:

+
+./configure --enable-debug=no
+
+

The above option make use of -DNDEBUG, which is used throughout libtorrent.

+
+
+

Step 3: Building libtorrent

+

Once the configure script is run successfully, you just type make and +libtorrent, the examples and the tests will be built.

+

When libtorrent is built it may be a good idea to run the tests, you do this +by running make check.

+

If you want to build a release version (without debug info, asserts and +invariant checks), you have to rerun the configure script and rebuild, like this:

+
+./configure --disable-debug
+make clean
+make
+
+
+
+
+

building with other build systems

+

If you're making your own project file, note that there are two versions of +the file abstraction. There's one file_win.cpp which relies on windows +file API that supports files larger than 2 Gigabytes. This does not work in +vc6 for some reason, possibly because it may require windows NT and above. +The other file, file.cpp is the default implementation that simply relies +on the standard low level io routines (read(), write(), open() +etc.), this implementation doesn't do anything special to support unicode +filenames, so if your target is Windows 2000 and up, you may want to use +file_win.cpp which supports unicode filenames.

+

If you're building in MS Visual Studio, you may have to set the compiler +options "force conformance in for loop scope", "treat wchar_t as built-in +type" and "Enable Run-Time Type Info" to Yes. For a detailed description +on how to build libtorrent with VS 2005, see this document.

+
+
+

build configurations

+

By default libtorrent is built In debug mode, and will have pretty expensive +invariant checks and asserts built into it. If you want to disable such checks +(you want to do that in a release build) you can see the table below for which +defines you can use to control the build.

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
macrodescription
NDEBUGIf you define this macro, all asserts, +invariant checks and general debug code will be +removed. This option takes precedence over +other debug settings.
TORRENT_LOGGINGThis macro will enable logging of the session +events, such as tracker announces and incoming +connections (as well as blocked connections).
TORRENT_VERBOSE_LOGGINGIf you define this macro, every peer connection +will log its traffic to a log file as well as +the session log.
TORRENT_STORAGE_DEBUGThis will enable extra expensive invariant +checks in the storage, including logging of +piece sorting.
UNICODEIf building on windows this will make sure the +UTF-8 strings in pathnames are converted into +UTF-16 before they are passed to the file +operations.
LITTLE_ENDIANThis will use the little endian version of the +sha-1 code. If defined on a big-endian system +the sha-1 hashes will be incorrect and fail. +If it is not defined and __BIG_ENDIAN__ +isn't defined either (it is defined by Apple's +GCC) both little-endian and big-endian versions +will be built and the correct code will be +chosen at run-time.
TORRENT_LINKING_SHAREDIf this is defined when including the +libtorrent headers, the classes and functions +will be tagged with __declspec(dllimport) +on msvc and default visibility on GCC 4 and +later. Set this in your project if you're +linking against libtorrent as a shared library. +(This is set by the Jamfile when +link=shared is set).
TORRENT_BUILDING_SHAREDIf this is defined, the functions and classes +in libtorrent are marked with +__declspec(dllexport) on msvc, or with +default visibility on GCC 4 and later. This +should be defined when building libtorrent as +a shared library. (This is set by the Jamfile +when link=shared is set).
TORRENT_DISABLE_DHTIf this is defined, the support for trackerless +torrents will be disabled.
+

If you experience that libtorrent uses unreasonable amounts of cpu, it will +definitely help to define NDEBUG, since it will remove the invariant checks +within the library.

+
+
+
+ + diff --git a/docs/building.rst b/docs/building.rst new file mode 100644 index 000000000..0ae2da4a9 --- /dev/null +++ b/docs/building.rst @@ -0,0 +1,386 @@ +================= +libtorrent manual +================= + +:Author: Arvid Norberg, arvid@rasterbar.com + +.. contents:: Table of contents + :depth: 2 + :backlinks: none + +downloading and building +======================== + +To acquire the latest version of libtorrent, you'll have to grab it from CVS. +You'll find instructions on how to do this here__ (see Anonymous CVS access). + +__ http://sourceforge.net/cvs/?group_id=79942 + +The build systems supported "out of the box" in libtorrent are boost-build v2 +(BBv2) and autotools (for unix-like systems). If you still can't build after +following these instructions, you can usually get help in the ``#libtorrent`` +IRC channel on ``irc.freenode.net``. + + +building with BBv2 +------------------ + +The primary reason to use boost-build is that it will automatically build the +dependent boost libraries with the correct compiler settings, in order to +ensure that the build targets are link compatible (see `boost guidelines`__ +for some details on this issue). + +__ http://boost.org/more/separate_compilation.html + +Since BBv2 will build the boost libraries for you, you need the full boost +source package. Having boost installed via some package system is usually not +enough (and even if it is enough, the necessary environment variables are +usually not set by the package installer). + + +Step 1: Download boost +~~~~~~~~~~~~~~~~~~~~~~ + +You'll find boost here__. + +__ http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041&release_id=376197 + +Extract the archive to some directory where you want it. For the sake of this +guide, let's assume you extract the package to ``c:\boost_1_33_1`` (I'm using +a windows path in this example since if you're on linux/unix you're more likely +to use the autotools). You'll need at least version 1.32 of the boost library +in order to build libtorrent. + +If you use 1.32, you need to download BBv2 separately, so for now, let's +assume you will use version 1.33.1. + + +Step 2: Setup BBv2 +~~~~~~~~~~~~~~~~~~ + +First you need to build ``bjam``. You do this by opening a terminal (In +windows, run ``cmd``). Change directory to +``c:\boost_1_33_1\tools\build\jam_src``. Then run the script called +``build.bat`` or ``build.sh`` on a unix system. This will build ``bjam`` and +place it in a directory starting with ``bin.`` and then have the name of your +platform. Copy the ``bjam.exe`` (or ``bjam`` on a unix system) to a place +that's in you shell's ``PATH``. On linux systems a place commonly used may be +``/usr/local/bin`` or on windows ``c:\windows`` (you can also add directories +to the search paths by modifying the environment variable called ``PATH``). + +Now you have ``bjam`` installed. ``bjam`` can be considered an interpreter +that the boost-build system is implemented on. So boost-build uses ``bjam``. +So, to complete the installation you need to make two more things. You need to +set the environment variable ``BOOST_BUILD_PATH``. This is the path that tells +``bjam`` where it can find boost-build, your configuration file and all the +toolsets (descriptions used by boost-build to know how to use different +compilers on different platforms). Assuming the boost install path above, set +it to ``c:\boost_1_33_1\tools\build\v2``. + +To set an environment variable in windows, type for example:: + + set BOOST_BUILD_PATH=c:\boost_1_33_1\tools\build\v2 + +In a terminal window. + +The last thing to do to complete the setup of BBv2 is to modify your +``user-config.jam`` file. It is located in ``c:\boost_1_33_1\tools\build\v2``. +Depending on your platform and which compiler you're using, you should add a +line for each compiler and compiler version you have installed on your system +that you want to be able to use with BBv2. For example, if you're using +Microsoft Visual Studio 7.1 (2003), just add a line:: + + using msvc : 7.1 ; + +If you use GCC, add the line:: + + using gcc ; + +If you have more than one version of GCC installed, you can add the +commandline used to invoke g++ after the version number, like this:: + + using gcc : 3.3 : g++-3.3 ; + using gcc : 4.0 : g++-4.0 ; + +Another toolset worth mentioning is the ``darwin`` toolset (For MacOS X). +From Tiger (10.4) MacOS X comes with both GCC 3.3 and GCC 4.0. Then you can +use the following toolsets:: + + using darwin : 3.3 : g++-3.3 ; + using darwin : 4.0 : g++-4.0 ; + +Note that the spaces around the semi-colons and colons are important! + + +Step 3: Building libtorrent +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When building libtorrent, the ``Jamfile`` expects the environment variable +``BOOST_ROOT`` to be set to the boost installation directory. It uses this to +find the boost libraries it depends on, so they can be built and their headers +files found. So, set this to ``c:\boost_1_33_1``. + +Then the only thing left is simply to invoke ``bjam``. If you want to specify +a specific toolset to use (compiler) you can just add that to the commandline. +For example:: + + bjam msvc-7.1 link=static + bjam gcc-3.3 link=static + bjam darwin-4.0 link=static + +To build different versions you can also just add the name of the build +variant. Some default build variants in BBv2 are ``release``, ``debug``, +``profile``. + +You can build libtorrent as a dll too, by typing ``link=shared``, or +``link=static`` to build a static library. ``link=shared`` is the default. + +If you want to explicitly say how to link against the runtime library, you +can set the ``runtime-link`` feature on the commandline, either to ``shared`` +or ``static``. Most operating systems will only allow linking shared against +the runtime, but on windows you can do both. Example:: + + bjam msvc-7.1 link=static runtime-link=static + +.. warning:: + + If you link statically to the runtime library, you cannot build libtorrent + as a shared library (DLL), since you will get separate heaps in the library + and in the client application. It will result in crashes. + + +The build targets are put in a directory called bin, and under it they are +sorted in directories depending on the toolset and build variant used. + +To build the examples, just change directory to the examples directory and +invoke ``bjam`` from there. To build and run the tests, go to the test +directory and run ``bjam``. + +Note that if you're building on windows using the ``msvc`` toolset, you cannot run it +from a cygwin terminal, you'll have to run it from a ``cmd`` terminal. The same goes for +cygwin, if you're building with gcc in cygwin you'll have to run it from a cygwin terminal. +Also, make sure the paths are correct in the different environments. In cygwin, the paths +(``BOOST_BUILD_PATH`` and ``BOOST_ROOT``) should be in the typical unix-format (e.g. +``/cygdrive/c/boost_1_33_1``). In the windows environment, they should have the typical +windows format (``c:/boost_1_33_1``). + +The ``Jamfile`` will define ``NDEBUG`` when it's building a release build. +There are two other build variants available in the ``Jamfile``. debug_log +and release_log, these two variants inherits from the debug and release +variants respectively, but adds extra logging (``TORRENT_VERBOSE_LOGGING``). +For more build configuration flags see `Build configurations`_. + +The ``Jamfile`` has the following build variants: + +* ``release`` - release version without any logging +* ``release_log`` - release version with standard logging +* ``release_vlog`` - release version with verbose logging (all peer connections are logged) +* ``debug`` - debug version without any logging +* ``debug_log`` - debug version with standard logging +* ``debug_vlog`` - debug version with verbose logging + +The logs created when building vlog or log mode are put in a directory called +``libtorrent_logs`` in the current working directory. + +When building the example client on windows, you need to build with +``link=static`` otherwise you may get unresolved external symbols for some +boost.program-options symbols. + +For more information, see the `Boost build v2 documentation`__. + +__ http://www.boost.org/tools/build/v2/index.html + +building with autotools +----------------------- + +First of all, you need to install ``automake`` and ``autoconf``. Many +unix/linux systems comes with these preinstalled. + +Step 1: Generating the build system +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +No build system is present if libtorrent is checked out from CVS - it +needs to be generated first. If you're building from a released tarball, +you may skip directly to `Step 2: Running configure`_. + +Execute the following commands, in the given order, to generate +the build system: + +* aclocal -I m4 +* autoheader +* libtoolize --copy --force +* automake --add-missing --copy --gnu +* autoconf + + +Step 2: Running configure +~~~~~~~~~~~~~~~~~~~~~~~~~ + +In your shell, change directory to the libtorrent directory and run +``./configure``. This will look for libraries and C++ features that libtorrent +is dependent on. If something is missing or can't be found it will print an +error telling you what failed. + +The most likely problem you may encounter is that the configure script won't +find the boost libraries. Make sure you have boost installed on your system. +The easiest way to install boost is usually to use the preferred package +system on your platform. Usually libraries and headers are installed in +standard directories where the compiler will find them, but sometimes that +may not be the case. For example when installing boost on darwin using +darwinports (the package system based on BSD ports) all libraries are +installed to ``/opt/local/lib`` and headers are installed to +``/opt/local/include``. By default the compiler will not look in these +directories. You have to set the enviornment variables ``LDFLAGS`` and +``CXXFLAGS`` in order to make the compiler find those libs. In this example +you'd set them like this:: + + export LDFLAGS=-L/opt/local/lib + export CXXFLAGS=-I/opt/local/include + +It was observed on FreeBSD (release 6.0) that one needs to add '-lpthread' to +LDFLAGS, as Boost::Thread detection will fail without it, even if +Boost::Thread is installed. + +If you need to set these variables, it may be a good idea to add those lines +to your ``~/.profile`` or ``~/.tcshrc`` depending on your shell. + +You know that the boost libraries were found if you see the following output +from the configure script:: + + checking whether the Boost::DateTime library is available... yes + checking for main in -lboost_date_time... yes + checking whether the Boost::Filesystem library is available... yes + checking for main in -lboost_filesystem... yes + checking whether the Boost::Thread library is available... yes + checking for main in -lboost_thread... yes + +Another possible source of problems may be if the path to your libtorrent +directory contains spaces. Make sure you either rename the directories with +spaces in their names to remove the spaces or move the libtorrent directory. + +Creating a debug build +~~~~~~~~~~~~~~~~~~~~~~ + +To tell configure to build a debug version (with debug info, asserts +and invariant checks enabled), you have to run the configure script +with the following option:: + + ./configure --enable-debug=yes + +Creating a release build +~~~~~~~~~~~~~~~~~~~~~~~~ + +To tell the configure to build a release version (without debug info, +asserts and invariant checks), you have to run the configure script +with the following option:: + + ./configure --enable-debug=no + +The above option make use of -DNDEBUG, which is used throughout libtorrent. + +Step 3: Building libtorrent +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once the configure script is run successfully, you just type ``make`` and +libtorrent, the examples and the tests will be built. + +When libtorrent is built it may be a good idea to run the tests, you do this +by running ``make check``. + +If you want to build a release version (without debug info, asserts and +invariant checks), you have to rerun the configure script and rebuild, like this:: + + ./configure --disable-debug + make clean + make + +building with other build systems +--------------------------------- + +If you're making your own project file, note that there are two versions of +the file abstraction. There's one ``file_win.cpp`` which relies on windows +file API that supports files larger than 2 Gigabytes. This does not work in +vc6 for some reason, possibly because it may require windows NT and above. +The other file, ``file.cpp`` is the default implementation that simply relies +on the standard low level io routines (``read()``, ``write()``, ``open()`` +etc.), this implementation doesn't do anything special to support unicode +filenames, so if your target is Windows 2000 and up, you may want to use +``file_win.cpp`` which supports unicode filenames. + +If you're building in MS Visual Studio, you may have to set the compiler +options "force conformance in for loop scope", "treat wchar_t as built-in +type" and "Enable Run-Time Type Info" to Yes. For a detailed description +on how to build libtorrent with VS 2005, see `this document`_. + +.. _`this document`: vs2005_build_notes.html + + +build configurations +-------------------- + +By default libtorrent is built In debug mode, and will have pretty expensive +invariant checks and asserts built into it. If you want to disable such checks +(you want to do that in a release build) you can see the table below for which +defines you can use to control the build. + ++--------------------------------+-------------------------------------------------+ +| macro | description | ++================================+=================================================+ +| ``NDEBUG`` | If you define this macro, all asserts, | +| | invariant checks and general debug code will be | +| | removed. This option takes precedence over | +| | other debug settings. | ++--------------------------------+-------------------------------------------------+ +| ``TORRENT_LOGGING`` | This macro will enable logging of the session | +| | events, such as tracker announces and incoming | +| | connections (as well as blocked connections). | ++--------------------------------+-------------------------------------------------+ +| ``TORRENT_VERBOSE_LOGGING`` | If you define this macro, every peer connection | +| | will log its traffic to a log file as well as | +| | the session log. | ++--------------------------------+-------------------------------------------------+ +| ``TORRENT_STORAGE_DEBUG`` | This will enable extra expensive invariant | +| | checks in the storage, including logging of | +| | piece sorting. | ++--------------------------------+-------------------------------------------------+ +| ``UNICODE`` | If building on windows this will make sure the | +| | UTF-8 strings in pathnames are converted into | +| | UTF-16 before they are passed to the file | +| | operations. | ++--------------------------------+-------------------------------------------------+ +| ``LITTLE_ENDIAN`` | This will use the little endian version of the | +| | sha-1 code. If defined on a big-endian system | +| | the sha-1 hashes will be incorrect and fail. | +| | If it is not defined and ``__BIG_ENDIAN__`` | +| | isn't defined either (it is defined by Apple's | +| | GCC) both little-endian and big-endian versions | +| | will be built and the correct code will be | +| | chosen at run-time. | ++--------------------------------+-------------------------------------------------+ +| ``TORRENT_LINKING_SHARED`` | If this is defined when including the | +| | libtorrent headers, the classes and functions | +| | will be tagged with ``__declspec(dllimport)`` | +| | on msvc and default visibility on GCC 4 and | +| | later. Set this in your project if you're | +| | linking against libtorrent as a shared library. | +| | (This is set by the Jamfile when | +| | ``link=shared`` is set). | ++--------------------------------+-------------------------------------------------+ +| ``TORRENT_BUILDING_SHARED`` | If this is defined, the functions and classes | +| | in libtorrent are marked with | +| | ``__declspec(dllexport)`` on msvc, or with | +| | default visibility on GCC 4 and later. This | +| | should be defined when building libtorrent as | +| | a shared library. (This is set by the Jamfile | +| | when ``link=shared`` is set). | ++--------------------------------+-------------------------------------------------+ +| ``TORRENT_DISABLE_DHT`` | If this is defined, the support for trackerless | +|Ê | torrents will be disabled. | ++--------------------------------+-------------------------------------------------+ + + +If you experience that libtorrent uses unreasonable amounts of cpu, it will +definitely help to define ``NDEBUG``, since it will remove the invariant checks +within the library. + + diff --git a/docs/examples.html b/docs/examples.html new file mode 100644 index 000000000..f6af367a4 --- /dev/null +++ b/docs/examples.html @@ -0,0 +1,257 @@ + + + + + + +libtorrent Examples + + + + +
+

libtorrent Examples

+ +++ + + + +
Author:Arvid Norberg, arvid@rasterbar.com
+
+

Table of contents

+ +
+
+

examples

+

Except for the example programs in this manual, there's also a bigger example +of a (little bit) more complete client, client_test. There are separate +instructions for how to use it here if you'd like to try it.

+
+

dump_torrent

+

This is an example of a program that will take a torrent-file as a parameter and +print information about it to std out:

+
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <iomanip>
+
+#include "libtorrent/entry.hpp"
+#include "libtorrent/bencode.hpp"
+#include "libtorrent/torrent_info.hpp"
+
+
+int main(int argc, char* argv[])
+{
+        using namespace libtorrent;
+
+        if (argc != 2)
+        {
+                std::cerr << "usage: dump_torrent torrent-file\n";
+                return 1;
+        }
+
+        try
+        {
+                std::ifstream in(argv[1], std::ios_base::binary);
+                in.unsetf(std::ios_base::skipws);
+                entry e = bdecode(std::istream_iterator<char>(in)
+                        , std::istream_iterator<char>());
+
+                std::cout << "\n\n----- raw info -----\n\n";
+                e.print(std::cout);
+
+                torrent_info t(e);
+
+                // print info about torrent
+                std::cout << "\n\n----- torrent file info -----\n\n";
+                std::cout << "trackers:\n";
+                for (std::vector<announce_entry>::const_iterator i
+                        = t.trackers().begin(); i != t.trackers().end(); ++i)
+                {
+                        std::cout << i->tier << ": " << i->url << "\n";
+                }
+
+                std::cout << "number of pieces: " << t.num_pieces() << "\n";
+                std::cout << "piece length: " << t.piece_length() << "\n";
+                std::cout << "info hash: " << t.info_hash() << "\n";
+                std::cout << "comment: " << t.comment() << "\n";
+                std::cout << "created by: " << t.creator() << "\n";
+                std::cout << "files:\n";
+                for (torrent_info::file_iterator i = t.begin_files();
+                        i != t.end_files(); ++i)
+                {
+                        std::cout << "  " << std::setw(11) << i->size
+                                << " " << i->path.string() << "\n";
+                }
+                
+        }
+        catch (std::exception& e)
+        {
+                std::cout << e.what() << "\n";
+        }
+
+        return 0;
+}
+
+
+
+

simple client

+

This is a simple client. It doesn't have much output to keep it simple:

+
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <exception>
+
+#include <boost/format.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include "libtorrent/entry.hpp"
+#include "libtorrent/bencode.hpp"
+#include "libtorrent/session.hpp"
+
+int main(int argc, char* argv[])
+{
+        using namespace libtorrent;
+
+        if (argc != 2)
+        {
+                std::cerr << "usage: ./simple_cient torrent-file\n"
+                        "to stop the client, press return.\n";
+                return 1;
+        }
+
+        try
+        {
+                session s;
+                s.listen_on(std::make_pair(6881, 6889));
+
+                std::ifstream in(argv[1], std::ios_base::binary);
+                in.unsetf(std::ios_base::skipws);
+                entry e = bdecode(std::istream_iterator<char>(in)
+                        , std::istream_iterator<char>());
+                s.add_torrent(torrent_info(e), "");
+                        
+                // wait for the user to end
+                char a;
+                std::cin.unsetf(std::ios_base::skipws);
+                std::cin >> a;
+        }
+        catch (std::exception& e)
+        {
+                std::cout << e.what() << "\n";
+        }
+        return 0;
+}
+
+
+
+

make_torrent

+

Shows how to create a torrent from a directory tree:

+
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <iomanip>
+
+#include "libtorrent/entry.hpp"
+#include "libtorrent/bencode.hpp"
+#include "libtorrent/torrent_info.hpp"
+#include "libtorrent/file.hpp"
+#include "libtorrent/storage.hpp"
+#include "libtorrent/hasher.hpp"
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/fstream.hpp>
+
+using namespace boost::filesystem;
+using namespace libtorrent;
+
+void add_files(torrent_info& t, path const& p, path const& l)
+{
+        path f(p / l);
+        if (is_directory(f))
+        {
+                for (directory_iterator i(f), end; i != end; ++i)
+                        add_files(t, p, l / i->leaf());
+        }
+        else
+        {
+                std::cerr << "adding \"" << l.string() << "\"\n";
+                file fi(f, file::in);
+                fi.seek(0, file::end);
+                libtorrent::size_type size = fi.tell();
+                t.add_file(l, size);
+        }
+}
+
+int main(int argc, char* argv[])
+{
+        using namespace libtorrent;
+        using namespace boost::filesystem;
+
+        if (argc != 4)
+        {
+                std::cerr << "usage: make_torrent <output torrent-file> "
+                        "<announce url> <file or directory to create torrent from>\n";
+                return 1;
+        }
+
+        boost::filesystem::path::default_name_check(native);
+
+        try
+        {
+                torrent_info t;
+                path full_path = initial_path() / path(argv[3]);
+                ofstream out(initial_path() / path(argv[1]), std::ios_base::binary);
+
+                int piece_size = 256 * 1024;
+                char const* creator_str = "libtorrent";
+
+                add_files(t, full_path.branch_path(), full_path.leaf());
+                t.set_piece_size(piece_size);
+
+                storage st(t, full_path.branch_path());
+                t.add_tracker(argv[2]);
+
+                // calculate the hash for all pieces
+                int num = t.num_pieces();
+                std::vector<char> buf(piece_size);
+                for (int i = 0; i < num; ++i)
+                {
+                        st.read(&buf[0], i, 0, t.piece_size(i));
+                        hasher h(&buf[0], t.piece_size(i));
+                        t.set_hash(i, h.final());
+                        std::cerr << (i+1) << "/" << num << "\r";
+                }
+
+                t.set_creator(creator_str);
+
+                // create the torrent and print it to out
+                entry e = t.create_torrent();
+                libtorrent::bencode(std::ostream_iterator<char>(out), e);
+        }
+        catch (std::exception& e)
+        {
+                std::cerr << e.what() << "\n";
+        }
+
+        return 0;
+}
+
+
+
+
+ + diff --git a/docs/examples.rst b/docs/examples.rst new file mode 100644 index 000000000..e093daddc --- /dev/null +++ b/docs/examples.rst @@ -0,0 +1,238 @@ +=================== +libtorrent Examples +=================== + +:Author: Arvid Norberg, arvid@rasterbar.com + +.. contents:: Table of contents + :depth: 2 + :backlinks: none + +examples +======== + +Except for the example programs in this manual, there's also a bigger example +of a (little bit) more complete client, ``client_test``. There are separate +instructions for how to use it here__ if you'd like to try it. + +__ client_test.html + +dump_torrent +------------ + +This is an example of a program that will take a torrent-file as a parameter and +print information about it to std out:: + + + #include + #include + #include + #include + + #include "libtorrent/entry.hpp" + #include "libtorrent/bencode.hpp" + #include "libtorrent/torrent_info.hpp" + + + int main(int argc, char* argv[]) + { + using namespace libtorrent; + + if (argc != 2) + { + std::cerr << "usage: dump_torrent torrent-file\n"; + return 1; + } + + try + { + std::ifstream in(argv[1], std::ios_base::binary); + in.unsetf(std::ios_base::skipws); + entry e = bdecode(std::istream_iterator(in) + , std::istream_iterator()); + + std::cout << "\n\n----- raw info -----\n\n"; + e.print(std::cout); + + torrent_info t(e); + + // print info about torrent + std::cout << "\n\n----- torrent file info -----\n\n"; + std::cout << "trackers:\n"; + for (std::vector::const_iterator i + = t.trackers().begin(); i != t.trackers().end(); ++i) + { + std::cout << i->tier << ": " << i->url << "\n"; + } + + std::cout << "number of pieces: " << t.num_pieces() << "\n"; + std::cout << "piece length: " << t.piece_length() << "\n"; + std::cout << "info hash: " << t.info_hash() << "\n"; + std::cout << "comment: " << t.comment() << "\n"; + std::cout << "created by: " << t.creator() << "\n"; + std::cout << "files:\n"; + for (torrent_info::file_iterator i = t.begin_files(); + i != t.end_files(); ++i) + { + std::cout << " " << std::setw(11) << i->size + << " " << i->path.string() << "\n"; + } + + } + catch (std::exception& e) + { + std::cout << e.what() << "\n"; + } + + return 0; + } + + +simple client +------------- + +This is a simple client. It doesn't have much output to keep it simple:: + + #include + #include + #include + #include + + #include + #include + + #include "libtorrent/entry.hpp" + #include "libtorrent/bencode.hpp" + #include "libtorrent/session.hpp" + + int main(int argc, char* argv[]) + { + using namespace libtorrent; + + if (argc != 2) + { + std::cerr << "usage: ./simple_cient torrent-file\n" + "to stop the client, press return.\n"; + return 1; + } + + try + { + session s; + s.listen_on(std::make_pair(6881, 6889)); + + std::ifstream in(argv[1], std::ios_base::binary); + in.unsetf(std::ios_base::skipws); + entry e = bdecode(std::istream_iterator(in) + , std::istream_iterator()); + s.add_torrent(torrent_info(e), ""); + + // wait for the user to end + char a; + std::cin.unsetf(std::ios_base::skipws); + std::cin >> a; + } + catch (std::exception& e) + { + std::cout << e.what() << "\n"; + } + return 0; + } + +make_torrent +------------ + +Shows how to create a torrent from a directory tree:: + + #include + #include + #include + #include + + #include "libtorrent/entry.hpp" + #include "libtorrent/bencode.hpp" + #include "libtorrent/torrent_info.hpp" + #include "libtorrent/file.hpp" + #include "libtorrent/storage.hpp" + #include "libtorrent/hasher.hpp" + + #include + #include + #include + + using namespace boost::filesystem; + using namespace libtorrent; + + void add_files(torrent_info& t, path const& p, path const& l) + { + path f(p / l); + if (is_directory(f)) + { + for (directory_iterator i(f), end; i != end; ++i) + add_files(t, p, l / i->leaf()); + } + else + { + std::cerr << "adding \"" << l.string() << "\"\n"; + file fi(f, file::in); + fi.seek(0, file::end); + libtorrent::size_type size = fi.tell(); + t.add_file(l, size); + } + } + + int main(int argc, char* argv[]) + { + using namespace libtorrent; + using namespace boost::filesystem; + + if (argc != 4) + { + std::cerr << "usage: make_torrent " + " \n"; + return 1; + } + + boost::filesystem::path::default_name_check(native); + + try + { + torrent_info t; + path full_path = initial_path() / path(argv[3]); + ofstream out(initial_path() / path(argv[1]), std::ios_base::binary); + + int piece_size = 256 * 1024; + char const* creator_str = "libtorrent"; + + add_files(t, full_path.branch_path(), full_path.leaf()); + t.set_piece_size(piece_size); + + storage st(t, full_path.branch_path()); + t.add_tracker(argv[2]); + + // calculate the hash for all pieces + int num = t.num_pieces(); + std::vector buf(piece_size); + for (int i = 0; i < num; ++i) + { + st.read(&buf[0], i, 0, t.piece_size(i)); + hasher h(&buf[0], t.piece_size(i)); + t.set_hash(i, h.final()); + std::cerr << (i+1) << "/" << num << "\r"; + } + + t.set_creator(creator_str); + + // create the torrent and print it to out + entry e = t.create_torrent(); + libtorrent::bencode(std::ostream_iterator(out), e); + } + catch (std::exception& e) + { + std::cerr << e.what() << "\n"; + } + + return 0; + } + + diff --git a/docs/features.html b/docs/features.html new file mode 100644 index 000000000..90fa2f7f5 --- /dev/null +++ b/docs/features.html @@ -0,0 +1,124 @@ + + + + + + +libtorrent manual + + + + +
+

libtorrent manual

+ +++ + + + +
Author:Arvid Norberg, arvid@rasterbar.com
+ +
+

introduction

+

libtorrent is a C++ library that aims to be a good alternative to all the +other bittorrent implementations around. It is a +library and not a full featured client, although it comes with a working +example client.

+

The main goals of libtorrent are:

+
    +
  • to be cpu efficient
  • +
  • to be memory efficient
  • +
  • to be very easy to use
  • +
+
+
+

features

+

libtorrent is still being developed, however it is stable. It is an ongoing +project (including this documentation). The current state includes the +following features:

+
    +
  • Trackerless torrents (using a kademlia DHT)
  • +
  • multitracker extension support (as specified by John Hoffman)
  • +
  • serves multiple torrents on a single port and in a single thread
  • +
  • gzipped tracker-responses
  • +
  • HTTP seeding, as specified by Michael Burford of GetRight.
  • +
  • piece picking on block-level (as opposed to piece-level). +This means it can download parts of the same piece from different peers. +It will also prefer to download whole pieces from single peers if the +download speed is high enough from that particular peer.
  • +
  • queues torrents for file check, instead of checking all of them in parallel.
  • +
  • supports http proxies and proxy authentication
  • +
  • uses separate threads for checking files and for main downloader, with a +fool-proof thread-safe library interface. (i.e. There's no way for the +user to cause a deadlock). (see threads)
  • +
  • can limit the upload and download bandwidth usage and the maximum number of +unchoked peers
  • +
  • piece-wise, unordered, incremental file allocation
  • +
  • implements fair trade. User settable trade-ratio, must at least be 1:1, +but one can choose to trade 1 for 2 or any other ratio that isn't unfair +to the other party.
  • +
  • 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.
  • +
  • supports an extension protocol. See extensions.
  • +
  • supports files > 2 gigabytes.
  • +
  • supports the no_peer_id=1 extension that will ease the load off trackers.
  • +
  • supports the udp-tracker protocol by Olaf van der Spek.
  • +
  • possibility to limit the number of connections.
  • +
  • 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.
  • +
  • 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.
  • +
  • adjusts the length of the request queue depending on download rate.
  • +
  • supports the compact=1 tracker parameter.
  • +
  • selective downloading. The ability to select which parts of a torrent you +want to download.
  • +
  • ip filter
  • +
+
+
+

portability

+

libtorrent is portable at least among Windows, MacOS X and other UNIX-systems. +It uses Boost.Thread, Boost.Filesystem, Boost.Date_time and various other +boost libraries as well as zlib (shipped) and asio (shipped). At least version +1.33.1 of boost is required.

+

Since libtorrent uses asio, it will take full advantage of high performance +network APIs on the most popular platforms. I/O completion ports on windows, +epoll on linux and kqueue on MacOS X and BSD.

+

libtorrent has been successfully compiled and tested on:

+
    +
  • Windows 2000 vc7.1, vc8
  • +
  • Linux x86 GCC 3.3, GCC 3.4.2
  • +
  • MacOS X (darwin), (Apple's) GCC 3.3, (Apple's) GCC 4.0
  • +
  • SunOS 5.8 GCC 3.1
  • +
  • Cygwin GCC 3.3.3
  • +
+

Fails on:

+
    +
  • GCC 2.95.4
  • +
  • msvc6
  • +
+
+
+

license

+

libtorrent is released under the BSD-license.

+

This means that you can use the library in your project without having to +release its source code. The only requirement is that you give credit +to the author of the library by including the libtorrent license in your +software or documentation.

+

Here's a list of some projects that uses libtorrent.

+
+
+ + diff --git a/docs/features.rst b/docs/features.rst new file mode 100644 index 000000000..7f490ee5f --- /dev/null +++ b/docs/features.rst @@ -0,0 +1,123 @@ +================= +libtorrent manual +================= + +:Author: Arvid Norberg, arvid@rasterbar.com + +.. contents:: Table of contents + :depth: 2 + :backlinks: none + +introduction +============ + +libtorrent is a C++ library that aims to be a good alternative to all the +other bittorrent implementations around. It is a +library and not a full featured client, although it comes with a working +example client. + +The main goals of libtorrent are: + +* to be cpu efficient +* to be memory efficient +* to be very easy to use + +features +======== + +libtorrent is still being developed, however it is stable. It is an ongoing +project (including this documentation). The current state includes the +following features: + +* Trackerless torrents (using a kademlia DHT) +* multitracker extension support (as `specified by John Hoffman`__) +* serves multiple torrents on a single port and in a single thread +* gzipped tracker-responses +* `HTTP seeding`_, as `specified by Michael Burford of GetRight`__. +* piece picking on block-level (as opposed to piece-level). + This means it can download parts of the same piece from different peers. + It will also prefer to download whole pieces from single peers if the + download speed is high enough from that particular peer. +* queues torrents for file check, instead of checking all of them in parallel. +* supports http proxies and proxy authentication +* uses separate threads for checking files and for main downloader, with a + fool-proof thread-safe library interface. (i.e. There's no way for the + user to cause a deadlock). (see threads_) +* can limit the upload and download bandwidth usage and the maximum number of + unchoked peers +* piece-wise, unordered, incremental file allocation +* implements fair trade. User settable trade-ratio, must at least be 1:1, + but one can choose to trade 1 for 2 or any other ratio that isn't unfair + to the other party. +* 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. +* supports an `extension protocol`__. See extensions_. +* supports files > 2 gigabytes. +* supports the ``no_peer_id=1`` extension that will ease the load off trackers. +* supports the `udp-tracker protocol`__ by Olaf van der Spek. +* possibility to limit the number of connections. +* 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. +* 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. +* adjusts the length of the request queue depending on download rate. +* supports the ``compact=1`` tracker parameter. +* selective downloading. The ability to select which parts of a torrent you + want to download. +* ip filter + +__ http://home.elp.rr.com/tur/multitracker-spec.txt +__ http://www.getright.com/seedtorrent.html +__ extension_protocol.html +__ udp_tracker_protocol.html + +portability +=========== + +libtorrent is portable at least among Windows, MacOS X and other UNIX-systems. +It uses Boost.Thread, Boost.Filesystem, Boost.Date_time and various other +boost libraries as well as zlib_ (shipped) and asio_ (shipped). At least version +1.33.1 of boost is required. + +.. _zlib: http://www.zlib.org +.. _asio: http://asio.sf.net + +Since libtorrent uses asio, it will take full advantage of high performance +network APIs on the most popular platforms. I/O completion ports on windows, +epoll on linux and kqueue on MacOS X and BSD. + +libtorrent has been successfully compiled and tested on: + +* Windows 2000 vc7.1, vc8 +* Linux x86 GCC 3.3, GCC 3.4.2 +* MacOS X (darwin), (Apple's) GCC 3.3, (Apple's) GCC 4.0 +* SunOS 5.8 GCC 3.1 +* Cygwin GCC 3.3.3 + +Fails on: + +* GCC 2.95.4 +* msvc6 + +license +======= + +libtorrent is released under the BSD-license_. + +.. _BSD-license: http://www.opensource.org/licenses/bsd-license.php + +This means that you can use the library in your project without having to +release its source code. The only requirement is that you give credit +to the author of the library by including the libtorrent license in your +software or documentation. + +`Here's`__ a list of some projects that uses libtorrent. + +__ projects.html + +.. _`http seeding`: manual.html#http-seeding +.. _threads: manual.html#threads +.. _extensions: manual.html#extensions + diff --git a/docs/index.html b/docs/index.html index 45206e020..b8a1b8a47 100755 --- a/docs/index.html +++ b/docs/index.html @@ -4,45 +4,37 @@ -libtorrent + -
-

libtorrent

- -------- - - - - - - - - - - +
+ +
+

libtorrent

libtorrent is a C++ library that aims to be a good alternative to all the other bittorrent implementations around. It is a library and not a full featured client, although it comes with a working example client.

The main goals of libtorrent are:

-
  • to be cpu efficient
  • to be memory efficient
  • to be very easy to use
-
-

Feedback

+

Feedback

There's a mailing list, general libtorrent discussion.

You can usually find me as hydri in #libtorrent on irc.freenode.net.

-

Acknowledgements

+

Acknowledgements

Written by Arvid Norberg. Copyright (c) 2003

Contributions by Magnus Jonsson, Daniel Wallin and Cory Nelson

Thanks to Reimond Retz for bugfixes, suggestions and testing

Project is hosted by sourceforge.

sf_logo

+
diff --git a/docs/index.rst b/docs/index.rst index 3978ff28e..c408bfde8 100755 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,20 +1,36 @@ +.. raw:: html + +
+ + +* features_ +* `building libtorrent`_ +* examples_ +* `api documentation`_ +* screenshot_ +* `mailing list`_ +* `who's using libtorrent?`_ +* `report bugs`_ +* `sourceforge page`_ + +.. raw:: html + +
+
+ ========== libtorrent ========== - -.. class:: menu - -=================== ============== ============== =========== =============== ========================== -`sourceforge page`_ documentation_ `report bugs`_ screenshot_ `mailing list`_ `who's using libtorrent?`_ -=================== ============== ============== =========== =============== ========================== - -.. _sourceforge page: http://www.sourceforge.net/projects/libtorrent -.. _documentation: manual.html -.. _`report bugs`: http://sourceforge.net/tracker/?group_id=79942&atid=558250 +.. _features: features.html +.. _`building libtorrent`: building.html +.. _examples: examples.html +.. _`api documentation`: manual.html .. _screenshot: client_test.png .. _mailing list: http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss .. _`who's using libtorrent?`: projects.html +.. _`report bugs`: http://sourceforge.net/tracker/?group_id=79942&atid=558250 +.. _sourceforge page: http://www.sourceforge.net/projects/libtorrent libtorrent is a C++ library that aims to be a good alternative to all the other bittorrent implementations around. It is a @@ -25,9 +41,9 @@ __ client_test.html The main goals of libtorrent are: - * to be cpu efficient - * to be memory efficient - * to be very easy to use +* to be cpu efficient +* to be memory efficient +* to be very easy to use Donate @@ -76,4 +92,7 @@ Project is hosted by sourceforge. .. |sf_logo| image:: http://sourceforge.net/sflogo.php?group_id=7994 __ http://sourceforge.net +.. raw:: html + +
diff --git a/docs/manual.html b/docs/manual.html index 52208ac8a..9f05a1321 100755 --- a/docs/manual.html +++ b/docs/manual.html @@ -4,13 +4,13 @@ -libtorrent manual +libtorrent API Documentation -
-

libtorrent manual

+
+

libtorrent API Documentation

@@ -24,577 +24,140 @@

Table of contents

-
-

introduction

-

libtorrent is a C++ library that aims to be a good alternative to all the -other bittorrent implementations around. It is a -library and not a full featured client, although it comes with a working -example client.

-

The main goals of libtorrent are:

-
    -
  • to be cpu efficient
  • -
  • to be memory efficient
  • -
  • to be very easy to use
  • -
-

libtorrent is still being developed, however it is stable. It is an ongoing -project (including this documentation). The current state includes the -following features:

-
    -
  • Trackerless torrents (using a kademlia DHT)
  • -
  • multitracker extension support (as specified by John Hoffman)
  • -
  • serves multiple torrents on a single port and in a single thread
  • -
  • gzipped tracker-responses
  • -
  • HTTP seeding, as specified by Michael Burford of GetRight.
  • -
  • piece picking on block-level (as opposed to piece-level). -This means it can download parts of the same piece from different peers. -It will also prefer to download whole pieces from single peers if the -download speed is high enough from that particular peer.
  • -
  • queues torrents for file check, instead of checking all of them in parallel.
  • -
  • supports http proxies and proxy authentication
  • -
  • uses separate threads for checking files and for main downloader, with a -fool-proof thread-safe library interface. (i.e. There's no way for the -user to cause a deadlock). (see threads)
  • -
  • can limit the upload and download bandwidth usage and the maximum number of -unchoked peers
  • -
  • piece-wise, unordered, incremental file allocation
  • -
  • implements fair trade. User settable trade-ratio, must at least be 1:1, -but one can choose to trade 1 for 2 or any other ratio that isn't unfair -to the other party.
  • -
  • 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.
  • -
  • supports an extension protocol. See extensions.
  • -
  • supports files > 2 gigabytes.
  • -
  • supports the no_peer_id=1 extension that will ease the load off trackers.
  • -
  • supports the udp-tracker protocol by Olaf van der Spek.
  • -
  • possibility to limit the number of connections.
  • -
  • 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.
  • -
  • 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.
  • -
  • adjusts the length of the request queue depending on download rate.
  • -
  • supports the compact=1 tracker parameter.
  • -
  • selective downloading. The ability to select which parts of a torrent you -want to download.
  • -
  • ip filter
  • -
-

libtorrent is portable at least among Windows, MacOS X and other UNIX-systems. -It uses Boost.Thread, Boost.Filesystem, Boost.Date_time and various other -boost libraries as well as zlib (shipped) and asio (shipped). At least version -1.33.1 of boost is required.

-

Since libtorrent uses asio, it will take full advantage of high performance -network APIs on the most popular platforms. I/O completion ports on windows, -epoll on linux and kqueue on MacOS X and BSD.

-

libtorrent has been successfully compiled and tested on:

-
    -
  • Windows 2000 vc7.1, vc8
  • -
  • Linux x86 GCC 3.3, GCC 3.4.2
  • -
  • MacOS X (darwin), (Apple's) GCC 3.3, (Apple's) GCC 4.0
  • -
  • SunOS 5.8 GCC 3.1
  • -
  • Cygwin GCC 3.3.3
  • -
-

Fails on:

-
    -
  • GCC 2.95.4
  • -
  • msvc6
  • -
-

libtorrent is released under the BSD-license.

-

This means that you can use the library in your project without having to -release its source code. The only requirement is that you give credit -to the author of the library by including the libtorrent license in your -software or documentation.

-

Here's a list of some projects that uses libtorrent.

-
-
-

downloading and building

-

To acquire the latest version of libtorrent, you'll have to grab it from CVS. -You'll find instructions on how to do this here (see Anonymous CVS access).

-

The build systems supported "out of the box" in libtorrent are boost-build v2 -(BBv2) and autotools (for unix-like systems). If you still can't build after -following these instructions, you can usually get help in the #libtorrent -IRC channel on irc.freenode.net.

-
-

building with BBv2

-

The primary reason to use boost-build is that it will automatically build the -dependent boost libraries with the correct compiler settings, in order to -ensure that the build targets are link compatible (see boost guidelines -for some details on this issue).

-

Since BBv2 will build the boost libraries for you, you need the full boost -source package. Having boost installed via some package system is usually not -enough (and even if it is enough, the necessary environment variables are -usually not set by the package installer).

-
-

Step 1: Download boost

-

You'll find boost here.

-

Extract the archive to some directory where you want it. For the sake of this -guide, let's assume you extract the package to c:\boost_1_33_1 (I'm using -a windows path in this example since if you're on linux/unix you're more likely -to use the autotools). You'll need at least version 1.32 of the boost library -in order to build libtorrent.

-

If you use 1.32, you need to download BBv2 separately, so for now, let's -assume you will use version 1.33.1.

-
-
-

Step 2: Setup BBv2

-

First you need to build bjam. You do this by opening a terminal (In -windows, run cmd). Change directory to -c:\boost_1_33_1\tools\build\jam_src. Then run the script called -build.bat or build.sh on a unix system. This will build bjam and -place it in a directory starting with bin. and then have the name of your -platform. Copy the bjam.exe (or bjam on a unix system) to a place -that's in you shell's PATH. On linux systems a place commonly used may be -/usr/local/bin or on windows c:\windows (you can also add directories -to the search paths by modifying the environment variable called PATH).

-

Now you have bjam installed. bjam can be considered an interpreter -that the boost-build system is implemented on. So boost-build uses bjam. -So, to complete the installation you need to make two more things. You need to -set the environment variable BOOST_BUILD_PATH. This is the path that tells -bjam where it can find boost-build, your configuration file and all the -toolsets (descriptions used by boost-build to know how to use different -compilers on different platforms). Assuming the boost install path above, set -it to c:\boost_1_33_1\tools\build\v2.

-

To set an environment variable in windows, type for example:

-
-set BOOST_BUILD_PATH=c:\boost_1_33_1\tools\build\v2
-
-

In a terminal window.

-

The last thing to do to complete the setup of BBv2 is to modify your -user-config.jam file. It is located in c:\boost_1_33_1\tools\build\v2. -Depending on your platform and which compiler you're using, you should add a -line for each compiler and compiler version you have installed on your system -that you want to be able to use with BBv2. For example, if you're using -Microsoft Visual Studio 7.1 (2003), just add a line:

-
-using msvc : 7.1 ;
-
-

If you use GCC, add the line:

-
-using gcc ;
-
-

If you have more than one version of GCC installed, you can add the -commandline used to invoke g++ after the version number, like this:

-
-using gcc : 3.3 : g++-3.3 ;
-using gcc : 4.0 : g++-4.0 ;
-
-

Another toolset worth mentioning is the darwin toolset (For MacOS X). -From Tiger (10.4) MacOS X comes with both GCC 3.3 and GCC 4.0. Then you can -use the following toolsets:

-
-using darwin : 3.3 : g++-3.3 ;
-using darwin : 4.0 : g++-4.0 ;
-
-

Note that the spaces around the semi-colons and colons are important!

-
-
-

Step 3: Building libtorrent

-

When building libtorrent, the Jamfile expects the environment variable -BOOST_ROOT to be set to the boost installation directory. It uses this to -find the boost libraries it depends on, so they can be built and their headers -files found. So, set this to c:\boost_1_33_1.

-

Then the only thing left is simply to invoke bjam. If you want to specify -a specific toolset to use (compiler) you can just add that to the commandline. -For example:

-
-bjam msvc-7.1 link=static
-bjam gcc-3.3 link=static
-bjam darwin-4.0 link=static
-
-

To build different versions you can also just add the name of the build -variant. Some default build variants in BBv2 are release, debug, -profile.

-

You can build libtorrent as a dll too, by typing link=shared, or -link=static to build a static library. link=shared is the default.

-

If you want to explicitly say how to link against the runtime library, you -can set the runtime-link feature on the commandline, either to shared -or static. Most operating systems will only allow linking shared against -the runtime, but on windows you can do both. Example:

-
-bjam msvc-7.1 link=static runtime-link=static
-
-
-

Warning

-

If you link statically to the runtime library, you cannot build libtorrent -as a shared library (DLL), since you will get separate heaps in the library -and in the client application. It will result in crashes.

-
-

The build targets are put in a directory called bin, and under it they are -sorted in directories depending on the toolset and build variant used.

-

To build the examples, just change directory to the examples directory and -invoke bjam from there. To build and run the tests, go to the test -directory and run bjam.

-

Note that if you're building on windows using the msvc toolset, you cannot run it -from a cygwin terminal, you'll have to run it from a cmd terminal. The same goes for -cygwin, if you're building with gcc in cygwin you'll have to run it from a cygwin terminal. -Also, make sure the paths are correct in the different environments. In cygwin, the paths -(BOOST_BUILD_PATH and BOOST_ROOT) should be in the typical unix-format (e.g. -/cygdrive/c/boost_1_33_1). In the windows environment, they should have the typical -windows format (c:/boost_1_33_1).

-

The Jamfile will define NDEBUG when it's building a release build. -There are two other build variants available in the Jamfile. debug_log -and release_log, these two variants inherits from the debug and release -variants respectively, but adds extra logging (TORRENT_VERBOSE_LOGGING). -For more build configuration flags see Build configurations.

-

The Jamfile has the following build variants:

-
    -
  • release - release version without any logging
  • -
  • release_log - release version with standard logging
  • -
  • release_vlog - release version with verbose logging (all peer connections are logged)
  • -
  • debug - debug version without any logging
  • -
  • debug_log - debug version with standard logging
  • -
  • debug_vlog - debug version with verbose logging
  • -
-

The logs created when building vlog or log mode are put in a directory called -libtorrent_logs in the current working directory.

-

When building the example client on windows, you need to build with -link=static otherwise you may get unresolved external symbols for some -boost.program-options symbols.

-

For more information, see the Boost build v2 documentation.

-
-
-
-

building with autotools

-

First of all, you need to install automake and autoconf. Many -unix/linux systems comes with these preinstalled.

-
-

Step 1: Generating the build system

-

No build system is present if libtorrent is checked out from CVS - it -needs to be generated first. If you're building from a released tarball, -you may skip directly to Step 2: Running configure.

-

Execute the following commands, in the given order, to generate -the build system:

-
    -
  • aclocal -I m4
  • -
  • autoheader
  • -
  • libtoolize --copy --force
  • -
  • automake --add-missing --copy --gnu
  • -
  • autoconf
  • -
-
-
-

Step 2: Running configure

-

In your shell, change directory to the libtorrent directory and run -./configure. This will look for libraries and C++ features that libtorrent -is dependent on. If something is missing or can't be found it will print an -error telling you what failed.

-

The most likely problem you may encounter is that the configure script won't -find the boost libraries. Make sure you have boost installed on your system. -The easiest way to install boost is usually to use the preferred package -system on your platform. Usually libraries and headers are installed in -standard directories where the compiler will find them, but sometimes that -may not be the case. For example when installing boost on darwin using -darwinports (the package system based on BSD ports) all libraries are -installed to /opt/local/lib and headers are installed to -/opt/local/include. By default the compiler will not look in these -directories. You have to set the enviornment variables LDFLAGS and -CXXFLAGS in order to make the compiler find those libs. In this example -you'd set them like this:

-
-export LDFLAGS=-L/opt/local/lib
-export CXXFLAGS=-I/opt/local/include
-
-

It was observed on FreeBSD (release 6.0) that one needs to add '-lpthread' to -LDFLAGS, as Boost::Thread detection will fail without it, even if -Boost::Thread is installed.

-

If you need to set these variables, it may be a good idea to add those lines -to your ~/.profile or ~/.tcshrc depending on your shell.

-

You know that the boost libraries were found if you see the following output -from the configure script:

-
-checking whether the Boost::DateTime library is available... yes
-checking for main in -lboost_date_time... yes
-checking whether the Boost::Filesystem library is available... yes
-checking for main in -lboost_filesystem... yes
-checking whether the Boost::Thread library is available... yes
-checking for main in -lboost_thread... yes
-
-

Another possible source of problems may be if the path to your libtorrent -directory contains spaces. Make sure you either rename the directories with -spaces in their names to remove the spaces or move the libtorrent directory.

-
-
-

Creating a debug build

-

To tell configure to build a debug version (with debug info, asserts -and invariant checks enabled), you have to run the configure script -with the following option:

-
-./configure --enable-debug=yes
-
-
-
-

Creating a release build

-

To tell the configure to build a release version (without debug info, -asserts and invariant checks), you have to run the configure script -with the following option:

-
-./configure --enable-debug=no
-
-

The above option make use of -DNDEBUG, which is used throughout libtorrent.

-
-
-

Step 3: Building libtorrent

-

Once the configure script is run successfully, you just type make and -libtorrent, the examples and the tests will be built.

-

When libtorrent is built it may be a good idea to run the tests, you do this -by running make check.

-

If you want to build a release version (without debug info, asserts and -invariant checks), you have to rerun the configure script and rebuild, like this:

-
-./configure --disable-debug
-make clean
-make
-
-
-
-
-

building with other build systems

-

If you're making your own project file, note that there are two versions of -the file abstraction. There's one file_win.cpp which relies on windows -file API that supports files larger than 2 Gigabytes. This does not work in -vc6 for some reason, possibly because it may require windows NT and above. -The other file, file.cpp is the default implementation that simply relies -on the standard low level io routines (read(), write(), open() -etc.), this implementation doesn't do anything special to support unicode -filenames, so if your target is Windows 2000 and up, you may want to use -file_win.cpp which supports unicode filenames.

-

If you're building in MS Visual Studio, you may have to set the compiler -options "force conformance in for loop scope", "treat wchar_t as built-in -type" and "Enable Run-Time Type Info" to Yes. For a detailed description -on how to build libtorrent with VS 2005, see this document.

-
-
-

build configurations

-

By default libtorrent is built In debug mode, and will have pretty expensive -invariant checks and asserts built into it. If you want to disable such checks -(you want to do that in a release build) you can see the table below for which -defines you can use to control the build.

-
---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
macrodescription
NDEBUGIf you define this macro, all asserts, -invariant checks and general debug code will be -removed. This option takes precedence over -other debug settings.
TORRENT_LOGGINGThis macro will enable logging of the session -events, such as tracker announces and incoming -connections (as well as blocked connections).
TORRENT_VERBOSE_LOGGINGIf you define this macro, every peer connection -will log its traffic to a log file as well as -the session log.
TORRENT_STORAGE_DEBUGThis will enable extra expensive invariant -checks in the storage, including logging of -piece sorting.
UNICODEIf building on windows this will make sure the -UTF-8 strings in pathnames are converted into -UTF-16 before they are passed to the file -operations.
LITTLE_ENDIANThis will use the little endian version of the -sha-1 code. If defined on a big-endian system -the sha-1 hashes will be incorrect and fail. -If it is not defined and __BIG_ENDIAN__ -isn't defined either (it is defined by Apple's -GCC) both little-endian and big-endian versions -will be built and the correct code will be -chosen at run-time.
TORRENT_LINKING_SHAREDIf this is defined when including the -libtorrent headers, the classes and functions -will be tagged with __declspec(dllimport) -on msvc and default visibility on GCC 4 and -later. Set this in your project if you're -linking against libtorrent as a shared library. -(This is set by the Jamfile when -link=shared is set).
TORRENT_BUILDING_SHAREDIf this is defined, the functions and classes -in libtorrent are marked with -__declspec(dllexport) on msvc, or with -default visibility on GCC 4 and later. This -should be defined when building libtorrent as -a shared library. (This is set by the Jamfile -when link=shared is set).
TORRENT_DISABLE_DHTIf this is defined, the support for trackerless -torrents will be disabled.
-

If you experience that libtorrent uses unreasonable amounts of cpu, it will -definitely help to define NDEBUG, since it will remove the invariant checks -within the library.

-

overview

@@ -631,7 +194,8 @@ class session: public boost::noncopyable { session(fingerprint const& print - = libtorrent::fingerprint("LT", 0, 1, 0, 0)); + = libtorrent::fingerprint( + "LT", 0, 1, 0, 0)); session( fingerprint const& print @@ -656,9 +220,11 @@ class session: public boost::noncopyable void remove_torrent(torrent_handle const& h); void disable_extensions(); - void enable_extension(peer_connection::extension_index); + void enable_extension( + peer_connection::extension_index); - void set_settings(session_settings const& settings); + void set_settings( + session_settings const& settings); void set_upload_rate_limit(int bytes_per_second); void set_download_rate_limit(int bytes_per_second); @@ -681,19 +247,22 @@ class session: public boost::noncopyable void start_dht(); void stop_dht(); - void set_dht_settings(dht_settings const& settings); + void set_dht_settings( + dht_settings const& settings); entry dht_state() const; - void add_dht_node(std::pair<std::string, int> const& node); + void add_dht_node(std::pair<std::string + , int> const& node); };

Once it's created, the session object will spawn the main thread that will do all the work. The main thread will be idle as long it doesn't have any torrents to participate in.

-
-

session()

+
+

session()

-session(fingerprint const& print = libtorrent::fingerprint("LT", 0, 1, 0, 0));
+session(fingerprint const& print
+        = libtorrent::fingerprint("LT", 0, 1, 0, 0));
 session(fingerprint const& print
         , std::pair<int, int> listen_port_range
         , char const* listen_interface = 0);
@@ -708,8 +277,8 @@ The other constructor, that takes a port range and an interface as well as the f
 will automatically try to listen on a port on the given interface. For more information about
 the parameters, see listen_on() function.

-
-

~session()

+
+

~session()

The destructor of session will notify all trackers that our torrents have been shut down. If some trackers are down, they will time out. All this before the destructor of session returns. So, it's advised that any kind of interface (such as windows) are closed before @@ -1207,8 +776,8 @@ public: sha1_hash const& hash_for_piece(unsigned int index) const; }; -

-

torrent_info()

+
+

torrent_info()

 torrent_info();
@@ -1262,7 +831,7 @@ to the torrent. The pathsize is given in bytes.

When you have added all the files and hashes to your torrent, you can generate an entry which then can be encoded as a .torrent file. You do this by calling create_torrent().

-

For a complete example of how to create a torrent from a file structure, see make_torrent.

+

For a complete example of how to create a torrent from a file structure, see make_torrent.

create_torrent()

@@ -1273,7 +842,7 @@ entry create_torrent();

Returns an entry representing the bencoded tree of data that makes up a .torrent file. You can save this data as a torrent file with bencode() (see bdecode() bencode()), for a -complete example, see make_torrent.

+complete example, see make_torrent.

This function is not const because it will also set the info-hash of the torrent_info object.

Note that a torrent file must include at least one file, and it must have at @@ -1766,8 +1335,8 @@ sha1_hash info_hash() const;

info_hash() returns the info-hash for the torrent.

-
-

set_max_uploads() set_max_connections()

+
+

set_max_uploads() set_max_connections()

 void set_max_uploads(int max_uploads) const;
@@ -1815,8 +1384,8 @@ std::vector<char> const& metadata() const;
 .torrent file. This buffer will be valid as long as the torrent is still running. When hashed,
 it will produce the same hash as the info-hash.

-
-

status()

+
+

status()

 torrent_status status() const;
@@ -2348,8 +1917,8 @@ public:
 };
 
-
-

ip_filter()

+
+

ip_filter()

 ip_filter()
@@ -3023,227 +2592,6 @@ struct invalid_torrent_file: std::exception
 
-
-

examples

-

Except for the example programs in this manual, there's also a bigger example -of a (little bit) more complete client, client_test. There are separate -instructions for how to use it here if you'd like to try it.

-
-

dump_torrent

-

This is an example of a program that will take a torrent-file as a parameter and -print information about it to std out:

-
-#include <iostream>
-#include <fstream>
-#include <iterator>
-#include <iomanip>
-
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/torrent_info.hpp"
-
-
-int main(int argc, char* argv[])
-{
-        using namespace libtorrent;
-
-        if (argc != 2)
-        {
-                std::cerr << "usage: dump_torrent torrent-file\n";
-                return 1;
-        }
-
-        try
-        {
-                std::ifstream in(argv[1], std::ios_base::binary);
-                in.unsetf(std::ios_base::skipws);
-                entry e = bdecode(std::istream_iterator<char>(in), std::istream_iterator<char>());
-
-                std::cout << "\n\n----- raw info -----\n\n";
-                e.print(std::cout);
-
-                torrent_info t(e);
-
-                // print info about torrent
-                std::cout << "\n\n----- torrent file info -----\n\n";
-                std::cout << "trackers:\n";
-                for (std::vector<announce_entry>::const_iterator i = t.trackers().begin();
-                        i != t.trackers().end(); ++i)
-                {
-                        std::cout << i->tier << ": " << i->url << "\n";
-                }
-
-                std::cout << "number of pieces: " << t.num_pieces() << "\n";
-                std::cout << "piece length: " << t.piece_length() << "\n";
-                std::cout << "info hash: " << t.info_hash() << "\n";
-                std::cout << "comment: " << t.comment() << "\n";
-                std::cout << "created by: " << t.creator() << "\n";
-                std::cout << "files:\n";
-                for (torrent_info::file_iterator i = t.begin_files();
-                        i != t.end_files(); ++i)
-                {
-                        std::cout << "  " << std::setw(11) << i->size
-                                << " " << i->path.string() << "\n";
-                }
-                
-        }
-        catch (std::exception& e)
-        {
-                std::cout << e.what() << "\n";
-        }
-
-        return 0;
-}
-
-
-
-

simple client

-

This is a simple client. It doesn't have much output to keep it simple:

-
-#include <iostream>
-#include <fstream>
-#include <iterator>
-#include <exception>
-
-#include <boost/format.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/session.hpp"
-
-int main(int argc, char* argv[])
-{
-        using namespace libtorrent;
-
-        if (argc != 2)
-        {
-                std::cerr << "usage: ./simple_cient torrent-file\n"
-                        "to stop the client, press return.\n";
-                return 1;
-        }
-
-        try
-        {
-                session s;
-                s.listen_on(std::make_pair(6881, 6889));
-
-                std::ifstream in(argv[1], std::ios_base::binary);
-                in.unsetf(std::ios_base::skipws);
-                entry e = bdecode(std::istream_iterator<char>(in)
-                        , std::istream_iterator<char>());
-                s.add_torrent(torrent_info(e), "");
-                        
-                // wait for the user to end
-                char a;
-                std::cin.unsetf(std::ios_base::skipws);
-                std::cin >> a;
-        }
-        catch (std::exception& e)
-        {
-                std::cout << e.what() << "\n";
-        }
-        return 0;
-}
-
-
-
-

make_torrent

-

Shows how to create a torrent from a directory tree:

-
-#include <iostream>
-#include <fstream>
-#include <iterator>
-#include <iomanip>
-
-#include "libtorrent/entry.hpp"
-#include "libtorrent/bencode.hpp"
-#include "libtorrent/torrent_info.hpp"
-#include "libtorrent/file.hpp"
-#include "libtorrent/storage.hpp"
-#include "libtorrent/hasher.hpp"
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-#include <boost/filesystem/fstream.hpp>
-
-using namespace boost::filesystem;
-using namespace libtorrent;
-
-void add_files(torrent_info& t, path const& p, path const& l)
-{
-        path f(p / l);
-        if (is_directory(f))
-        {
-                for (directory_iterator i(f), end; i != end; ++i)
-                        add_files(t, p, l / i->leaf());
-        }
-        else
-        {
-                std::cerr << "adding \"" << l.string() << "\"\n";
-                file fi(f, file::in);
-                fi.seek(0, file::end);
-                libtorrent::size_type size = fi.tell();
-                t.add_file(l, size);
-        }
-}
-
-int main(int argc, char* argv[])
-{
-        using namespace libtorrent;
-        using namespace boost::filesystem;
-
-        if (argc != 4)
-        {
-                std::cerr << "usage: make_torrent <output torrent-file> "
-                        "<announce url> <file or directory to create torrent from>\n";
-                return 1;
-        }
-
-        boost::filesystem::path::default_name_check(native);
-
-        try
-        {
-                torrent_info t;
-                path full_path = initial_path() / path(argv[3]);
-                ofstream out(initial_path() / path(argv[1]), std::ios_base::binary);
-
-                int piece_size = 256 * 1024;
-                char const* creator_str = "libtorrent";
-
-                add_files(t, full_path.branch_path(), full_path.leaf());
-                t.set_piece_size(piece_size);
-
-                storage st(t, full_path.branch_path());
-                t.add_tracker(argv[2]);
-
-                // calculate the hash for all pieces
-                int num = t.num_pieces();
-                std::vector<char> buf(piece_size);
-                for (int i = 0; i < num; ++i)
-                {
-                        st.read(&buf[0], i, 0, t.piece_size(i));
-                        hasher h(&buf[0], t.piece_size(i));
-                        t.set_hash(i, h.final());
-                        std::cerr << (i+1) << "/" << num << "\r";
-                }
-
-                t.set_creator(creator_str);
-
-                // create the torrent and print it to out
-                entry e = t.create_torrent();
-                libtorrent::bencode(std::ostream_iterator<char>(out), e);
-        }
-        catch (std::exception& e)
-        {
-                std::cerr << e.what() << "\n";
-        }
-
-        return 0;
-}
-
-
-

fast resume

The fast resume mechanism is a way to remember which pieces are downloaded diff --git a/docs/manual.rst b/docs/manual.rst index 8d83ca45e..71005616e 100755 --- a/docs/manual.rst +++ b/docs/manual.rst @@ -1,6 +1,6 @@ -================= -libtorrent manual -================= +============================ +libtorrent API Documentation +============================ :Author: Arvid Norberg, arvid@rasterbar.com :Version: 0.11 @@ -9,481 +9,6 @@ libtorrent manual :depth: 2 :backlinks: none -introduction -============ - -libtorrent is a C++ library that aims to be a good alternative to all the -other bittorrent implementations around. It is a -library and not a full featured client, although it comes with a working -example client. - -The main goals of libtorrent are: - -* to be cpu efficient -* to be memory efficient -* to be very easy to use - -libtorrent is still being developed, however it is stable. It is an ongoing -project (including this documentation). The current state includes the -following features: - -* Trackerless torrents (using a kademlia DHT) -* multitracker extension support (as `specified by John Hoffman`__) -* serves multiple torrents on a single port and in a single thread -* gzipped tracker-responses -* `HTTP seeding`_, as `specified by Michael Burford of GetRight`__. -* piece picking on block-level (as opposed to piece-level). - This means it can download parts of the same piece from different peers. - It will also prefer to download whole pieces from single peers if the - download speed is high enough from that particular peer. -* queues torrents for file check, instead of checking all of them in parallel. -* supports http proxies and proxy authentication -* uses separate threads for checking files and for main downloader, with a - fool-proof thread-safe library interface. (i.e. There's no way for the - user to cause a deadlock). (see threads_) -* can limit the upload and download bandwidth usage and the maximum number of - unchoked peers -* piece-wise, unordered, incremental file allocation -* implements fair trade. User settable trade-ratio, must at least be 1:1, - but one can choose to trade 1 for 2 or any other ratio that isn't unfair - to the other party. -* 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. -* supports an `extension protocol`__. See extensions_. -* supports files > 2 gigabytes. -* supports the ``no_peer_id=1`` extension that will ease the load off trackers. -* supports the `udp-tracker protocol`__ by Olaf van der Spek. -* possibility to limit the number of connections. -* 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. -* 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. -* adjusts the length of the request queue depending on download rate. -* supports the ``compact=1`` tracker parameter. -* selective downloading. The ability to select which parts of a torrent you - want to download. -* ip filter - -__ http://home.elp.rr.com/tur/multitracker-spec.txt -__ http://www.getright.com/seedtorrent.html -__ extension_protocol.html -__ udp_tracker_protocol.html - -libtorrent is portable at least among Windows, MacOS X and other UNIX-systems. -It uses Boost.Thread, Boost.Filesystem, Boost.Date_time and various other -boost libraries as well as zlib_ (shipped) and asio_ (shipped). At least version -1.33.1 of boost is required. - -.. _zlib: http://www.zlib.org -.. _asio: http://asio.sf.net - -Since libtorrent uses asio, it will take full advantage of high performance -network APIs on the most popular platforms. I/O completion ports on windows, -epoll on linux and kqueue on MacOS X and BSD. - -libtorrent has been successfully compiled and tested on: - -* Windows 2000 vc7.1, vc8 -* Linux x86 GCC 3.3, GCC 3.4.2 -* MacOS X (darwin), (Apple's) GCC 3.3, (Apple's) GCC 4.0 -* SunOS 5.8 GCC 3.1 -* Cygwin GCC 3.3.3 - -Fails on: - -* GCC 2.95.4 -* msvc6 - -libtorrent is released under the BSD-license_. - -.. _BSD-license: http://www.opensource.org/licenses/bsd-license.php - -This means that you can use the library in your project without having to -release its source code. The only requirement is that you give credit -to the author of the library by including the libtorrent license in your -software or documentation. - -`Here's`__ a list of some projects that uses libtorrent. - -__ projects.html - -downloading and building -======================== - -To acquire the latest version of libtorrent, you'll have to grab it from CVS. -You'll find instructions on how to do this here__ (see Anonymous CVS access). - -__ http://sourceforge.net/cvs/?group_id=79942 - -The build systems supported "out of the box" in libtorrent are boost-build v2 -(BBv2) and autotools (for unix-like systems). If you still can't build after -following these instructions, you can usually get help in the ``#libtorrent`` -IRC channel on ``irc.freenode.net``. - - -building with BBv2 ------------------- - -The primary reason to use boost-build is that it will automatically build the -dependent boost libraries with the correct compiler settings, in order to -ensure that the build targets are link compatible (see `boost guidelines`__ -for some details on this issue). - -__ http://boost.org/more/separate_compilation.html - -Since BBv2 will build the boost libraries for you, you need the full boost -source package. Having boost installed via some package system is usually not -enough (and even if it is enough, the necessary environment variables are -usually not set by the package installer). - - -Step 1: Download boost -~~~~~~~~~~~~~~~~~~~~~~ - -You'll find boost here__. - -__ http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041&release_id=376197 - -Extract the archive to some directory where you want it. For the sake of this -guide, let's assume you extract the package to ``c:\boost_1_33_1`` (I'm using -a windows path in this example since if you're on linux/unix you're more likely -to use the autotools). You'll need at least version 1.32 of the boost library -in order to build libtorrent. - -If you use 1.32, you need to download BBv2 separately, so for now, let's -assume you will use version 1.33.1. - - -Step 2: Setup BBv2 -~~~~~~~~~~~~~~~~~~ - -First you need to build ``bjam``. You do this by opening a terminal (In -windows, run ``cmd``). Change directory to -``c:\boost_1_33_1\tools\build\jam_src``. Then run the script called -``build.bat`` or ``build.sh`` on a unix system. This will build ``bjam`` and -place it in a directory starting with ``bin.`` and then have the name of your -platform. Copy the ``bjam.exe`` (or ``bjam`` on a unix system) to a place -that's in you shell's ``PATH``. On linux systems a place commonly used may be -``/usr/local/bin`` or on windows ``c:\windows`` (you can also add directories -to the search paths by modifying the environment variable called ``PATH``). - -Now you have ``bjam`` installed. ``bjam`` can be considered an interpreter -that the boost-build system is implemented on. So boost-build uses ``bjam``. -So, to complete the installation you need to make two more things. You need to -set the environment variable ``BOOST_BUILD_PATH``. This is the path that tells -``bjam`` where it can find boost-build, your configuration file and all the -toolsets (descriptions used by boost-build to know how to use different -compilers on different platforms). Assuming the boost install path above, set -it to ``c:\boost_1_33_1\tools\build\v2``. - -To set an environment variable in windows, type for example:: - - set BOOST_BUILD_PATH=c:\boost_1_33_1\tools\build\v2 - -In a terminal window. - -The last thing to do to complete the setup of BBv2 is to modify your -``user-config.jam`` file. It is located in ``c:\boost_1_33_1\tools\build\v2``. -Depending on your platform and which compiler you're using, you should add a -line for each compiler and compiler version you have installed on your system -that you want to be able to use with BBv2. For example, if you're using -Microsoft Visual Studio 7.1 (2003), just add a line:: - - using msvc : 7.1 ; - -If you use GCC, add the line:: - - using gcc ; - -If you have more than one version of GCC installed, you can add the -commandline used to invoke g++ after the version number, like this:: - - using gcc : 3.3 : g++-3.3 ; - using gcc : 4.0 : g++-4.0 ; - -Another toolset worth mentioning is the ``darwin`` toolset (For MacOS X). -From Tiger (10.4) MacOS X comes with both GCC 3.3 and GCC 4.0. Then you can -use the following toolsets:: - - using darwin : 3.3 : g++-3.3 ; - using darwin : 4.0 : g++-4.0 ; - -Note that the spaces around the semi-colons and colons are important! - - -Step 3: Building libtorrent -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When building libtorrent, the ``Jamfile`` expects the environment variable -``BOOST_ROOT`` to be set to the boost installation directory. It uses this to -find the boost libraries it depends on, so they can be built and their headers -files found. So, set this to ``c:\boost_1_33_1``. - -Then the only thing left is simply to invoke ``bjam``. If you want to specify -a specific toolset to use (compiler) you can just add that to the commandline. -For example:: - - bjam msvc-7.1 link=static - bjam gcc-3.3 link=static - bjam darwin-4.0 link=static - -To build different versions you can also just add the name of the build -variant. Some default build variants in BBv2 are ``release``, ``debug``, -``profile``. - -You can build libtorrent as a dll too, by typing ``link=shared``, or -``link=static`` to build a static library. ``link=shared`` is the default. - -If you want to explicitly say how to link against the runtime library, you -can set the ``runtime-link`` feature on the commandline, either to ``shared`` -or ``static``. Most operating systems will only allow linking shared against -the runtime, but on windows you can do both. Example:: - - bjam msvc-7.1 link=static runtime-link=static - -.. warning:: - - If you link statically to the runtime library, you cannot build libtorrent - as a shared library (DLL), since you will get separate heaps in the library - and in the client application. It will result in crashes. - - -The build targets are put in a directory called bin, and under it they are -sorted in directories depending on the toolset and build variant used. - -To build the examples, just change directory to the examples directory and -invoke ``bjam`` from there. To build and run the tests, go to the test -directory and run ``bjam``. - -Note that if you're building on windows using the ``msvc`` toolset, you cannot run it -from a cygwin terminal, you'll have to run it from a ``cmd`` terminal. The same goes for -cygwin, if you're building with gcc in cygwin you'll have to run it from a cygwin terminal. -Also, make sure the paths are correct in the different environments. In cygwin, the paths -(``BOOST_BUILD_PATH`` and ``BOOST_ROOT``) should be in the typical unix-format (e.g. -``/cygdrive/c/boost_1_33_1``). In the windows environment, they should have the typical -windows format (``c:/boost_1_33_1``). - -The ``Jamfile`` will define ``NDEBUG`` when it's building a release build. -There are two other build variants available in the ``Jamfile``. debug_log -and release_log, these two variants inherits from the debug and release -variants respectively, but adds extra logging (``TORRENT_VERBOSE_LOGGING``). -For more build configuration flags see `Build configurations`_. - -The ``Jamfile`` has the following build variants: - -* ``release`` - release version without any logging -* ``release_log`` - release version with standard logging -* ``release_vlog`` - release version with verbose logging (all peer connections are logged) -* ``debug`` - debug version without any logging -* ``debug_log`` - debug version with standard logging -* ``debug_vlog`` - debug version with verbose logging - -The logs created when building vlog or log mode are put in a directory called -``libtorrent_logs`` in the current working directory. - -When building the example client on windows, you need to build with -``link=static`` otherwise you may get unresolved external symbols for some -boost.program-options symbols. - -For more information, see the `Boost build v2 documentation`__. - -__ http://www.boost.org/tools/build/v2/index.html - -building with autotools ------------------------ - -First of all, you need to install ``automake`` and ``autoconf``. Many -unix/linux systems comes with these preinstalled. - -Step 1: Generating the build system -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -No build system is present if libtorrent is checked out from CVS - it -needs to be generated first. If you're building from a released tarball, -you may skip directly to `Step 2: Running configure`_. - -Execute the following commands, in the given order, to generate -the build system: - -* aclocal -I m4 -* autoheader -* libtoolize --copy --force -* automake --add-missing --copy --gnu -* autoconf - - -Step 2: Running configure -~~~~~~~~~~~~~~~~~~~~~~~~~ - -In your shell, change directory to the libtorrent directory and run -``./configure``. This will look for libraries and C++ features that libtorrent -is dependent on. If something is missing or can't be found it will print an -error telling you what failed. - -The most likely problem you may encounter is that the configure script won't -find the boost libraries. Make sure you have boost installed on your system. -The easiest way to install boost is usually to use the preferred package -system on your platform. Usually libraries and headers are installed in -standard directories where the compiler will find them, but sometimes that -may not be the case. For example when installing boost on darwin using -darwinports (the package system based on BSD ports) all libraries are -installed to ``/opt/local/lib`` and headers are installed to -``/opt/local/include``. By default the compiler will not look in these -directories. You have to set the enviornment variables ``LDFLAGS`` and -``CXXFLAGS`` in order to make the compiler find those libs. In this example -you'd set them like this:: - - export LDFLAGS=-L/opt/local/lib - export CXXFLAGS=-I/opt/local/include - -It was observed on FreeBSD (release 6.0) that one needs to add '-lpthread' to -LDFLAGS, as Boost::Thread detection will fail without it, even if -Boost::Thread is installed. - -If you need to set these variables, it may be a good idea to add those lines -to your ``~/.profile`` or ``~/.tcshrc`` depending on your shell. - -You know that the boost libraries were found if you see the following output -from the configure script:: - - checking whether the Boost::DateTime library is available... yes - checking for main in -lboost_date_time... yes - checking whether the Boost::Filesystem library is available... yes - checking for main in -lboost_filesystem... yes - checking whether the Boost::Thread library is available... yes - checking for main in -lboost_thread... yes - -Another possible source of problems may be if the path to your libtorrent -directory contains spaces. Make sure you either rename the directories with -spaces in their names to remove the spaces or move the libtorrent directory. - -Creating a debug build -~~~~~~~~~~~~~~~~~~~~~~ - -To tell configure to build a debug version (with debug info, asserts -and invariant checks enabled), you have to run the configure script -with the following option:: - - ./configure --enable-debug=yes - -Creating a release build -~~~~~~~~~~~~~~~~~~~~~~~~ - -To tell the configure to build a release version (without debug info, -asserts and invariant checks), you have to run the configure script -with the following option:: - - ./configure --enable-debug=no - -The above option make use of -DNDEBUG, which is used throughout libtorrent. - -Step 3: Building libtorrent -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Once the configure script is run successfully, you just type ``make`` and -libtorrent, the examples and the tests will be built. - -When libtorrent is built it may be a good idea to run the tests, you do this -by running ``make check``. - -If you want to build a release version (without debug info, asserts and -invariant checks), you have to rerun the configure script and rebuild, like this:: - - ./configure --disable-debug - make clean - make - -building with other build systems ---------------------------------- - -If you're making your own project file, note that there are two versions of -the file abstraction. There's one ``file_win.cpp`` which relies on windows -file API that supports files larger than 2 Gigabytes. This does not work in -vc6 for some reason, possibly because it may require windows NT and above. -The other file, ``file.cpp`` is the default implementation that simply relies -on the standard low level io routines (``read()``, ``write()``, ``open()`` -etc.), this implementation doesn't do anything special to support unicode -filenames, so if your target is Windows 2000 and up, you may want to use -``file_win.cpp`` which supports unicode filenames. - -If you're building in MS Visual Studio, you may have to set the compiler -options "force conformance in for loop scope", "treat wchar_t as built-in -type" and "Enable Run-Time Type Info" to Yes. For a detailed description -on how to build libtorrent with VS 2005, see `this document`_. - -.. _`this document`: vs2005_build_notes.html - - -build configurations --------------------- - -By default libtorrent is built In debug mode, and will have pretty expensive -invariant checks and asserts built into it. If you want to disable such checks -(you want to do that in a release build) you can see the table below for which -defines you can use to control the build. - -+--------------------------------+-------------------------------------------------+ -| macro | description | -+================================+=================================================+ -| ``NDEBUG`` | If you define this macro, all asserts, | -| | invariant checks and general debug code will be | -| | removed. This option takes precedence over | -| | other debug settings. | -+--------------------------------+-------------------------------------------------+ -| ``TORRENT_LOGGING`` | This macro will enable logging of the session | -| | events, such as tracker announces and incoming | -| | connections (as well as blocked connections). | -+--------------------------------+-------------------------------------------------+ -| ``TORRENT_VERBOSE_LOGGING`` | If you define this macro, every peer connection | -| | will log its traffic to a log file as well as | -| | the session log. | -+--------------------------------+-------------------------------------------------+ -| ``TORRENT_STORAGE_DEBUG`` | This will enable extra expensive invariant | -| | checks in the storage, including logging of | -| | piece sorting. | -+--------------------------------+-------------------------------------------------+ -| ``UNICODE`` | If building on windows this will make sure the | -| | UTF-8 strings in pathnames are converted into | -| | UTF-16 before they are passed to the file | -| | operations. | -+--------------------------------+-------------------------------------------------+ -| ``LITTLE_ENDIAN`` | This will use the little endian version of the | -| | sha-1 code. If defined on a big-endian system | -| | the sha-1 hashes will be incorrect and fail. | -| | If it is not defined and ``__BIG_ENDIAN__`` | -| | isn't defined either (it is defined by Apple's | -| | GCC) both little-endian and big-endian versions | -| | will be built and the correct code will be | -| | chosen at run-time. | -+--------------------------------+-------------------------------------------------+ -| ``TORRENT_LINKING_SHARED`` | If this is defined when including the | -| | libtorrent headers, the classes and functions | -| | will be tagged with ``__declspec(dllimport)`` | -| | on msvc and default visibility on GCC 4 and | -| | later. Set this in your project if you're | -| | linking against libtorrent as a shared library. | -| | (This is set by the Jamfile when | -| | ``link=shared`` is set). | -+--------------------------------+-------------------------------------------------+ -| ``TORRENT_BUILDING_SHARED`` | If this is defined, the functions and classes | -| | in libtorrent are marked with | -| | ``__declspec(dllexport)`` on msvc, or with | -| | default visibility on GCC 4 and later. This | -| | should be defined when building libtorrent as | -| | a shared library. (This is set by the Jamfile | -| | when ``link=shared`` is set). | -+--------------------------------+-------------------------------------------------+ -| ``TORRENT_DISABLE_DHT`` | If this is defined, the support for trackerless | -|Ê | torrents will be disabled. | -+--------------------------------+-------------------------------------------------+ - - -If you experience that libtorrent uses unreasonable amounts of cpu, it will -definitely help to define ``NDEBUG``, since it will remove the invariant checks -within the library. - overview ======== @@ -517,7 +42,8 @@ The ``session`` class has the following synopsis:: { session(fingerprint const& print - = libtorrent::fingerprint("LT", 0, 1, 0, 0)); + = libtorrent::fingerprint( + "LT", 0, 1, 0, 0)); session( fingerprint const& print @@ -542,9 +68,11 @@ The ``session`` class has the following synopsis:: void remove_torrent(torrent_handle const& h); void disable_extensions(); - void enable_extension(peer_connection::extension_index); + void enable_extension( + peer_connection::extension_index); - void set_settings(session_settings const& settings); + void set_settings( + session_settings const& settings); void set_upload_rate_limit(int bytes_per_second); void set_download_rate_limit(int bytes_per_second); @@ -567,9 +95,11 @@ The ``session`` class has the following synopsis:: void start_dht(); void stop_dht(); - void set_dht_settings(dht_settings const& settings); + void set_dht_settings( + dht_settings const& settings); entry dht_state() const; - void add_dht_node(std::pair const& node); + void add_dht_node(std::pair const& node); }; @@ -581,7 +111,8 @@ session() :: - session(fingerprint const& print = libtorrent::fingerprint("LT", 0, 1, 0, 0)); + session(fingerprint const& print + = libtorrent::fingerprint("LT", 0, 1, 0, 0)); session(fingerprint const& print , std::pair listen_port_range , char const* listen_interface = 0); @@ -1216,6 +747,8 @@ Returns an ``entry`` representing the bencoded tree of data that makes up a .tor You can save this data as a torrent file with bencode() (see `bdecode() bencode()`_), for a complete example, see make_torrent_. +.. _make_torrent: examples.html#make_torrent + This function is not const because it will also set the info-hash of the ``torrent_info`` object. @@ -3151,233 +2684,6 @@ doesn't meet the requirements on what information has to be present in a torrent }; -examples -======== - -Except for the example programs in this manual, there's also a bigger example -of a (little bit) more complete client, ``client_test``. There are separate -instructions for how to use it here__ if you'd like to try it. - -__ client_test.html - -dump_torrent ------------- - -This is an example of a program that will take a torrent-file as a parameter and -print information about it to std out:: - - - #include - #include - #include - #include - - #include "libtorrent/entry.hpp" - #include "libtorrent/bencode.hpp" - #include "libtorrent/torrent_info.hpp" - - - int main(int argc, char* argv[]) - { - using namespace libtorrent; - - if (argc != 2) - { - std::cerr << "usage: dump_torrent torrent-file\n"; - return 1; - } - - try - { - std::ifstream in(argv[1], std::ios_base::binary); - in.unsetf(std::ios_base::skipws); - entry e = bdecode(std::istream_iterator(in), std::istream_iterator()); - - std::cout << "\n\n----- raw info -----\n\n"; - e.print(std::cout); - - torrent_info t(e); - - // print info about torrent - std::cout << "\n\n----- torrent file info -----\n\n"; - std::cout << "trackers:\n"; - for (std::vector::const_iterator i = t.trackers().begin(); - i != t.trackers().end(); ++i) - { - std::cout << i->tier << ": " << i->url << "\n"; - } - - std::cout << "number of pieces: " << t.num_pieces() << "\n"; - std::cout << "piece length: " << t.piece_length() << "\n"; - std::cout << "info hash: " << t.info_hash() << "\n"; - std::cout << "comment: " << t.comment() << "\n"; - std::cout << "created by: " << t.creator() << "\n"; - std::cout << "files:\n"; - for (torrent_info::file_iterator i = t.begin_files(); - i != t.end_files(); ++i) - { - std::cout << " " << std::setw(11) << i->size - << " " << i->path.string() << "\n"; - } - - } - catch (std::exception& e) - { - std::cout << e.what() << "\n"; - } - - return 0; - } - - -simple client -------------- - -This is a simple client. It doesn't have much output to keep it simple:: - - #include - #include - #include - #include - - #include - #include - - #include "libtorrent/entry.hpp" - #include "libtorrent/bencode.hpp" - #include "libtorrent/session.hpp" - - int main(int argc, char* argv[]) - { - using namespace libtorrent; - - if (argc != 2) - { - std::cerr << "usage: ./simple_cient torrent-file\n" - "to stop the client, press return.\n"; - return 1; - } - - try - { - session s; - s.listen_on(std::make_pair(6881, 6889)); - - std::ifstream in(argv[1], std::ios_base::binary); - in.unsetf(std::ios_base::skipws); - entry e = bdecode(std::istream_iterator(in) - , std::istream_iterator()); - s.add_torrent(torrent_info(e), ""); - - // wait for the user to end - char a; - std::cin.unsetf(std::ios_base::skipws); - std::cin >> a; - } - catch (std::exception& e) - { - std::cout << e.what() << "\n"; - } - return 0; - } - -make_torrent ------------- - -Shows how to create a torrent from a directory tree:: - - #include - #include - #include - #include - - #include "libtorrent/entry.hpp" - #include "libtorrent/bencode.hpp" - #include "libtorrent/torrent_info.hpp" - #include "libtorrent/file.hpp" - #include "libtorrent/storage.hpp" - #include "libtorrent/hasher.hpp" - - #include - #include - #include - - using namespace boost::filesystem; - using namespace libtorrent; - - void add_files(torrent_info& t, path const& p, path const& l) - { - path f(p / l); - if (is_directory(f)) - { - for (directory_iterator i(f), end; i != end; ++i) - add_files(t, p, l / i->leaf()); - } - else - { - std::cerr << "adding \"" << l.string() << "\"\n"; - file fi(f, file::in); - fi.seek(0, file::end); - libtorrent::size_type size = fi.tell(); - t.add_file(l, size); - } - } - - int main(int argc, char* argv[]) - { - using namespace libtorrent; - using namespace boost::filesystem; - - if (argc != 4) - { - std::cerr << "usage: make_torrent " - " \n"; - return 1; - } - - boost::filesystem::path::default_name_check(native); - - try - { - torrent_info t; - path full_path = initial_path() / path(argv[3]); - ofstream out(initial_path() / path(argv[1]), std::ios_base::binary); - - int piece_size = 256 * 1024; - char const* creator_str = "libtorrent"; - - add_files(t, full_path.branch_path(), full_path.leaf()); - t.set_piece_size(piece_size); - - storage st(t, full_path.branch_path()); - t.add_tracker(argv[2]); - - // calculate the hash for all pieces - int num = t.num_pieces(); - std::vector buf(piece_size); - for (int i = 0; i < num; ++i) - { - st.read(&buf[0], i, 0, t.piece_size(i)); - hasher h(&buf[0], t.piece_size(i)); - t.set_hash(i, h.final()); - std::cerr << (i+1) << "/" << num << "\r"; - } - - t.set_creator(creator_str); - - // create the torrent and print it to out - entry e = t.create_torrent(); - libtorrent::bencode(std::ostream_iterator(out), e); - } - catch (std::exception& e) - { - std::cerr << e.what() << "\n"; - } - - return 0; - } - - fast resume =========== diff --git a/docs/projects.html b/docs/projects.html index 71849120e..3e67cebad 100644 --- a/docs/projects.html +++ b/docs/projects.html @@ -37,7 +37,7 @@ well). Written by Christophe Dumez.

btg

-

btg is a *nix bittorrent client +

btg is a unix bittorrent client which is run as a daemon. It has multiple user interfaces which connects to the daemon. One GUI @@ -46,9 +46,6 @@ connects to the daemon. One GUI (accessable through a web browser). Written by Michael Wojciechowski and Johan Ström.

-
-

System Message: WARNING/2 (projects.rst, line 27); backlink

-Inline emphasis start-string without end-string.
btg_thumb.jpg
diff --git a/docs/projects.rst b/docs/projects.rst index 14b16057f..40c5e31a1 100644 --- a/docs/projects.rst +++ b/docs/projects.rst @@ -23,7 +23,7 @@ project listed here, let me_ know. +-------------------------------------+-----------------------------------------------+ | **btg** | .. image:: btg_thumb.jpg | | | | -| btg_ is a *nix bittorrent client | | +| btg_ is a unix bittorrent client | | | which is run as a daemon. It has | | | multiple user interfaces which | | | connects to the daemon. One GUI | | diff --git a/docs/style.css b/docs/style.css index d73ba7e96..8bdadf496 100755 --- a/docs/style.css +++ b/docs/style.css @@ -274,6 +274,18 @@ dd pre { li p, li li { font-size: 100%; } +#librarySidebar { + float: left; + width: 150px; +} + +#libraryBody { + border-left: solid 1px #eee; + padding-left: 10px; + margin-left: 158px; + margin-right: 10px; +} + /* IE Hacks */ /* Hides from IE-mac \*/