linux下P2P協議(BitTorrent)-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
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,簡稱b2,b2是一個直譯器。它通過解釋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
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原始碼分析(一)整體框架
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