1. 程式人生 > 實用技巧 >linux下P2P協議(BitTorrent)-libtorrent庫編譯,測試

linux下P2P協議(BitTorrent)-libtorrent庫編譯,測試

1.libtorrent 簡介,下載和編譯

libtorrent簡介

libtorrent是功能齊全的C ++ bittorrent的p2p協議實現,專注於效率和可伸縮性。它可以在嵌入式裝置和桌上型電腦上執行。它擁有完善的文件庫,易於使用。 它提供了client_test可以用於解析torrent種子和磁力連結。常見使用libtorrent庫的專案有qBittorrent,deluge,Free download manager等。

libtorrent官網地址:http://libtorrent.org/index.html

官方libtorrent 測試客戶端執行如圖

Tracker簡介

在BT下載中,有一個非常重要的角色,那就是Tracker伺服器。Tracker會追蹤有多少人在下載同一檔案,並把這些名單傳送到BT軟體上。BT軟體再嘗試連線這些使用者,以此來給你提供下載速度,同時你也會給他們貢獻速度。

簡單來說,Tracker伺服器起到的,就是牽線搭橋的作用,而這正是BT下載的核心。越熱門、越優質的Tracker,資源解析速度及下載速度就越快。普通BT軟體速度不穩定,就是因為內建的Tracker太少。

opentracker是一個linux中開源和免費的BitTorrent Tracker ,旨在實現一個最小化資源使用,並且可以在無線路由器中使用的輕量級tracker伺服器。

opentracker官網地址:https://erdgeist.org/arts/software/opentracker/

P2P網路中peer和tracker的關係圖

(1).所有原始碼下載地址

boost下載地址:https://www.boost.org/users/download/#live

libtorrent下載地址:https://github.com/arvidn/libtorrent/releases

openssl下載地址:https://www.openssl.org/source/openssl-1.1.1g.tar.gz

opentracker下載地址: https://gitee.com/cc12655/OpenTracker

(2).安裝gcc,g++編譯器

$ sudo apt install gcc g++ automake autoconf

以下所有操作都是在ubuntu命令列下進行的。

!!!建議一切操作之前,先好好看看libtorrent手冊 !!!

libtorrent manual

https://github.com/arvidn/libtorrent/blob/77cc099e849b4bf27042023018cf8c3013e6afe4/docs/manual.rst#build-configurations

downloading and building

https://www.libtorrent.org/building.html#building-with-bbv2

(3).編譯boost

libtorrent使用boost C++庫作為基礎庫而開發的,所以需要先編譯boost庫,注意boost版本>=1.58才可以在libtorrent庫中使用.

首先解壓到一個目錄

$ tar -zxvf boost_1_74_0.tar.gz

進入boost_1_74_0目錄中, 正常編譯:

$ cd boost_1_74_0
$ ./bootstrap.sh --with-libraries=all --with-toolset=gcc

--with-liraries:指定需要編譯的庫 --with-toolset:指定編譯時使用的編譯器

安裝boost庫,這個過程很漫長。。。

$ ./b2 install --prefix=/usr/local

--prefix:boost庫的安裝目錄,不加此引數,預設安裝在/usr/local目錄下

...patience...
...patience...
...patience...
...patience...
...patience...
...patience...
...found 13916 targets...

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/home/kevin/programming/libtorrent/boost_1_74_0

The following directory should be added to linker library paths:

/home/kevin/programming/libtorrent/boost_1_74_0/stage/lib

boost庫編譯完成後可以看到它提示需要將boost庫的標頭檔案路徑和庫檔案路徑新增到系統的包含目錄中,便於其他軟體編譯時進行呼叫。

boost庫編譯之後,會生成的編譯管理系統boost-build v2,簡稱b2b2是一個直譯器。它通過解釋jamfile,載入編譯系統來編譯其他軟體,以下會使用b2來編譯libtorrent庫

(4).編譯openssl

libtorrent依賴openssl,不安裝openssl的情況下,編譯libtorrent會報找不到ss1.h標頭檔案

編譯安裝openssl

$ cd openssl-1.1.1g/

$ ./config --prefix=/usr/local/openssl

$ sudo make install

(5).編譯libtorrent

libtorrent官網: https://www.libtorrent.org/index.html

在libtorrent目錄執行b2(boost庫編譯之後生成的編譯管理系統boost-build)來編譯libtorrent

$ b2 install --prefix=/usr/local

(a).編譯問題1:找不到boost-build.jam檔案

會發現找不到boost-build.jam檔案,報錯如下

Unable to load Boost.Build: could not find "boost-build.jam"

b2(boost-build v2, 以下均簡稱b2)所做的第一件事不是查詢Jamfile,而是載入編譯系統。但是Boost.Build的編譯系統究竟是什麼呢?

b2是一個直譯器。它不知道如何編譯任何東西。b2的任務就是解釋jamfile。Boost.Build實際上是在jamfile中實現的。它們包含了所有使Boost.Build成為強大工具的邏輯。因為b2只做它在Jamfiles中讀取的任務,所以它需要知道在哪裡可以找到構成Boost.Build的Jamfiles。

b2啟動時,它會在當前工作目錄中尋找boost-build.jam。如果沒有找到檔案,它會搜尋所有的父目錄。這個檔案只需要包含一行就可以告訴b2在哪裡找到編譯系統。

Windows下路徑:

boost-build C:/boost_1_57_0/tools/build/src ;

Linux下在libtorrent解壓目錄下建立boost-build.jam檔案,寫入以下內容:

boost-build /home/kevin/programming/libtorrent/boost_1_74_0/tools/build/src ;

boost-build之後的路徑必須引用一個目錄,該目錄包含一個名為bootstrap.jam的檔案。這是b2載入編譯系統所需的檔案。隨著Boost C++庫,附帶了Boost.Build。您可以引用Boost C++庫根目錄的子目錄tools/build。而且,您可以始終使用斜槓作為路徑分隔符,即使是Windows。

請注意,路徑和行尾的分號之間必須有空格。沒有空格是語法錯誤。在本文後面,您將瞭解更多Jamfiles中使用的語法。

(b).編譯問題2:boost連結庫無法連結的錯誤

mkdir: cannot create directory ‘/usr/local/share/cmake’: Permission denied

mkdir -p "/usr/local/share/cmake"

...failed common.mkdir /usr/local/share/cmake...
...skipped /usr/local/share/cmake/Modules for lack of /usr/local/share/cmake...
...skipped <p/usr/local/share/cmake/Modules>FindLibtorrentRasterbar.cmake for lack of /usr/local/share/cmake/Modules...
gcc.link.dll bin/gcc-9/debug/threading-multi/libtorrent.so.1.2.9
/usr/bin/ld: cannot find -lboost_system
collect2: error: ld returned 1 exit status

"g++" -L"/usr/local/lib" -L"/usr/local/opt/boost/lib"

用vi 開啟/etc/profile,在檔案最後把之前編譯boost之後的boost相關標頭檔案路徑,庫檔案路徑,連結庫路徑加上:

export  CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/home/kevin/programming/libtorrent/boost_1_74_0

export LIBRARY_PATH=$LIBRARY_PATH:/home/kevin/programming/libtorrent/boost_1_74_0/stage/lib

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kevin/programming/libtorrent/boost_1_74_0/stage/lib

然後終端中使用source命令使/etc/profile配置的路徑生效

$ source /etc/profile

然後就可以接著編譯libtorrent了

$ b2 install --prefix=/usr/local
CXXFLAGS =
LDFLAGS =
OS = LINUX
warning: No toolsets are configured.
warning: Configuring default toolset "gcc".
warning: If the default is wrong, your build may not work correctly.
warning: Use the "toolset=xxxxx" option to override our guess.
warning: For more configuration options, please consult
warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html
...patience...
...found 1613 targets...
...updating 5 targets...
gcc.link.dll bin/gcc-9/debug/threading-multi/libtorrent.so.1.2.9
common.copy /usr/local/lib/libtorrent.so.1.2.9
cp: cannot create regular file '/usr/local/lib/libtorrent.so.1.2.9': Permission denied

cp "bin/gcc-9/debug/threading-multi/libtorrent.so.1.2.9" "/usr/local/lib/libtorrent.so.1.2.9"

...failed common.copy /usr/local/lib/libtorrent.so.1.2.9...

從以下編譯日誌可以看出,解決了”/usr/bin/ld: cannot find -lboost_system“無法連結boost庫的問題了。

gcc.link.dll bin/gcc-9/debug/threading-multi/libtorrent.so.1.2.9

但是會出現以下“ Permission denied”錯誤

cp: cannot create regular file '/usr/local/lib/libtorrent.so.1.2.9': Permission denied

所以要加sudo執行b2

$ sudo b2 install --prefix=/usr/local
CXXFLAGS =
LDFLAGS =
OS = LINUX
warning: No toolsets are configured.
warning: Configuring default toolset "gcc".
warning: If the default is wrong, your build may not work correctly.
warning: Use the "toolset=xxxxx" option to override our guess.
warning: For more configuration options, please consult
warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html
...patience...
...found 1613 targets...
...updating 4 targets...
common.copy /usr/local/lib/libtorrent.so.1.2.9
ln-UNIX /usr/local/lib/libtorrent.so
ln-UNIX /usr/local/lib/libtorrent.so.1
ln-UNIX /usr/local/lib/libtorrent.so.1.2
...updated 4 targets...

至此libtorrent庫編譯完成。

(6).編譯libtorrent庫的client test,執行和下載測試

在libtorrent的解壓目錄下的examples目錄下執行b2即可編譯client_test

$ b2
CXXFLAGS =
LDFLAGS =
OS = LINUX
warning: No toolsets are configured.
warning: Configuring default toolset "gcc".
warning: If the default is wrong, your build may not work correctly.
warning: Use the "toolset=xxxxx" option to override our guess.
warning: For more configuration options, please consult
warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html
...patience...
...found 1201 targets...
...updating 191 targets...
gcc.compile.c++ ../bin/gcc-9/debug-mode/link-static/threading-multi/ed25519/src/add_scalar.o
...
gcc.compile.c++ bin/gcc-9/debug-mode/link-static/threading-multi/client_test.o
...

gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/client_test
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/simple_client
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/custom_storage
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/bt-get
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/bt-get2
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/stats_counters
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/dump_torrent
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/make_torrent
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/connection_tester
gcc.link bin/gcc-9/debug-mode/link-static/threading-multi/upnp_test

可以看到client_test已經編譯成功!: )

client_test就在examples/bin/gcc-9/debug-mode/link-static/threading-multi目錄下:

$ cd /bin/gcc-9/debug-mode/link-static/threading-multi
$ ./client_test
usage: client_test [OPTIONS] [TORRENT|MAGNETURL]

libtorrent支援torrent種子下載或者磁力連結下載。

libtorrent的client_test最簡單的測試就是找一個網上現有的熱門torrent種子資源或者magnet URL(磁力連結),即可進行下載(當然前提是連線網際網路)。比如找一個美劇資源(比如在91美劇網 https://91mjw.com )的磁力連結:

magnet:?xt=urn:btih:5b5317b19416ac76f84d3119381e08e1a4affe69

$ ./client_test magnet:?xt=urn:btih:5b5317b19416ac76f84d3119381e08e1a4affe69 -s /home/kevin/Downloads

執行client_test之後,會進入client_test監控介面,client_test中可用的命令是:

q退出客戶端(客戶端等待跟蹤器響應時會有延遲)

l切換日誌。將在底部顯示日誌,通知有關跟蹤器和對等事件的資訊。

i切換種子資訊。將顯示每個種子的同級列表。

d切換下載資訊。將顯示每個種子的阻止列表,並顯示下載和請求的阻止。

p暫停所有種子。

u恢復所有種子。

r強制跟蹤器針對所有種子重新宣佈。

f切換顯示檔案進度。顯示所有檔案的列表以及每個檔案的下載進度。

按 i 就可以看到所有的torrent資訊節點來源,以及這些資源用的什麼客戶端以及客戶端版本號,從下圖就可以看出比如: BitComet, aria2, Transmission, uTorrent, qBittorrent這些常用的BT下載軟體所提供的資源資訊。

檔案下載完成後,會為其他客戶端seeding(做種)

2.搭建tracker伺服器測試libtorrent

(1).執行tracker伺服器

先把tracker伺服器跑起來,指定ip地址和埠號

$ ./opentracker -i 192.168.1.5 -p 8080

用瀏覽器開啟 http://ip:埠號/stats (比如這裡就是剛設定的http://192.168.1.5:8080/stats),

可以檢視到tracker伺服器上記錄的torrent資訊。如下圖:

(2).製作種子檔案

在libtorrent/examples/bin/gcc-9/debug-mode/link-static/threading-multi目錄下,執行make_torrent,根據原始檔案製作種子檔案(torrent),同時也可以指定tracker伺服器地址。

$ ./make_torrent Faded-AlanWalker.mp4 -t http://192.168.1.5:8080/announce -t udp://192.168.1.5:8080/announce -o Faded-AlanWalker.mp4.torrent

(3).執行client_test

拷貝種子檔案到其他目錄下,執行client_test,通過p2p下載檔案。

這裡在三個不同的目錄下都放了同一個種子檔案Faded-AlanWalker.mp4.torrent,運行了三個客戶端同時進行下載,-s 選項 指定了各自的儲存下載檔案目錄路徑。

特別注意 !!! 不要在同一個IP地址下執行三個客戶端,這樣是沒辦法多個客戶端同時互傳資料的。

$ ./client_test /mnt/e/test/aa/Faded-AlanWalker.mp4.torrent -s /mnt/e/test/aa/
$ ./client_test /mnt/e/test/bb/Faded-AlanWalker.mp4.torrent -s /mnt/e/test/bb/
$ ./client_test /mnt/e/test/cc/Faded-AlanWalker.mp4.torrent -s /mnt/e/test/cc/

實際用官方用例測試,可以下載檔案,但是下載速度超級慢,原因待查...

3.重新編譯libtorrent,取消除錯

(1). configure錯誤

$ ./configure --disable-debug
Checking for boost libraries:
checking for boostlib >= 1.58 (105800)... yes
checking whether g++ supports C++11 features with -std=c++11... yes
checking whether the Boost::System library is available... yes
configure: error: Could not find a version of the Boost::System library!

不使用b2編譯時,在configure階段,每次都提示找不到boost系統庫檔案,這個問題的解決方案是在configure階段新增指定system library路徑

--with-boost-libdir=/home/kevin/programming/libtorrent/boost_1_74_0/stage/lib

$ ./configure --disable-debug \
--with-boost-libdir=/home/kevin/programming/libtorrent/boost_1_74_0/stage/lib

$ make clean

$ make

4.參考連結:

(1).libtorrent相關連結

libtorrent manual

https://github.com/arvidn/libtorrent/blob/77cc099e849b4bf27042023018cf8c3013e6afe4/docs/manual.rst#build-configurations

Boost.Build 簡明教程:https://blog.csdn.net/weixin_30911809/article/details/99513419

libtorrent downloading and building https://www.libtorrent.org/building.html#build-configurations

Boost.Build Tutorial :https://www.boost.org/doc/libs/1_58_0/tools/build/tutorial.html

What is BiTorrent? http://bittorrent.org/introduction.html

libtorrent資料整理:https://www.cnblogs.com/bugutian/p/8392328.html

P2P原理與技術:https://wenku.baidu.com/view/a042db0bf78a6529647d53bf.html

磁力連結是如何實現下載的?

https://www.aneasystone.com/archives/2015/05/how-does-magnet-link-work.html

百度網盤和視訊網站都在用的P2P技術是什麼?

https://blog.csdn.net/sinat_32970179/article/details/105690284

libtorrent原始碼分析(一)整體框架

https://blog.csdn.net/u013354486/article/details/96574185?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.channel_param

BTlibtorrent/torrent_info介面筆記 :http://blog.chinaunix.net/uid-11707862-id-1608611.html

libtorrent 官方手冊: https://www.libtorrent.org/reference.html

IPFS 和 BitTorrent 區別 https://www.jianshu.com/p/4aae453f1a67

有價值的IPFS部落格 https://www.cnblogs.com/bugutian/p/10075321.html

BitTorrent的DHT協議(譯自官方版本) https://blog.csdn.net/xxxxxx91116/article/details/7970815

Gingko——百度內網用於資料分發p2p工具 https://m.youku.com/video/id_XNzY4MzkyNzk2.html?from=s1.8-1-1.2&source=

基於 FUSE 的 Bittorrent 檔案系統 | Linux 中國 https://mp.weixin.qq.com/s/vmh5hHrVA0fJJyFRS5IpKw

(2).tracker伺服器相關連結

BitTorrent Tracker伺服器原始碼分析(部分) BT https://www.cnblogs.com/pursue/articles/1598528.html

BT伺服器的搭建(tracker-P2P伺服器架設)https://www.cnblogs.com/EasonJim/p/6601330.html

Centos7使用OpenTracker自建高效能Tracker伺服器

https://blog.csdn.net/qq1784855023/article/details/85332267

最新Tracker伺服器地址 提升BT種子、磁力連結下載速度 https://www.xitmi.com/5784.html

OpenTracker https://gitee.com/cc12655/OpenTracker

opentracker – An open and free bittorrent tracker http://erdgeist.org/arts/software/opentracker/

OpenTracker的說明與安裝 https://www.zybuluo.com/zhongdao/note/1434469

XBT Tracker http://xbtt.sourceforge.net/tracker/

Ubuntu搭建BT伺服器&FTP伺服器釋出種子 https://blog.csdn.net/qq_25672665/article/details/81586640

搭建內網BT伺服器 https://www.cnblogs.com/rupeng/archive/2010/06/19/1761070.html

使用BT協議構建軟體快速分發系統(可用於Linux內網快速分發檔案)

https://blog.csdn.net/jailman/article/details/86231517

trackerlist(這些trackerlist每天會更新)

https://github.com/ngosang/trackerslist

https://github.com/XIU2/TrackersListCollection