很早前就想整个BT 服务器 玩玩,一直都是最后半途而废。这次总算是把整个过程都弄明白了,其实根本就不是什么难事情,就是资料太难找了,在GOOGLE搜的关于架设BT 服务 器的文章还是几年前的那几篇老掉牙的文章,英文又菜得不得了,看文章得用星际译霸一个个翻译。搞得头大了好几天。
现在国内 网络 上 比较常见的track主要是Bitcomettrack,94BT,还有个btmas,全都不开源,当然也就不在我的选择范围之内了
国外网络上的track主要是bittorrent,BNBT,还有一些完全用PHP做的tracker.
Bittorrent是最原版的BT track了,虽然除了一个 track的功能,但是你可以在上面做很轻易的扩充,也是我的最终选择。
BNBT是用C++编写的track,还带了PHP的发布页面,但感觉发布 系统 做得太粗糙了,本来想拿过来改一下,看了看代码发现C的部分把很多功能都已经包括进去了,也懒得去研究它的代码,于是作罢。
至于纯粹用PHP做的tracker和发布系统,经过连续几天在sf.net 上的搜索,找到了一个非常优秀的,BT系统 :Tbsource 。做的超级优秀!其功能齐全程度几乎相当于一个 论坛 了,看了下代码,好象主要是通过把种子和连接信息写入MYSQL种来实现的,种子信息还好,但是连接信息是时刻在变化的,这样对数据库的操作会不会太频繁了?可能是我没完全看懂它的原理。我经常上的www.filemp3.org 和bmtorrents.net就是用Tbsource作的,速度和稳定性都很好啊!但是正因为T bsource做的太完善了,我都不知道 如何 去修改。以后有时间再详细研究下,把其中核心的部分抽出来作成DISCUZ的BT插件,应该是个好主意。
最后还是回到了bittorrent,就用个 tracke就可以了,自己用PHP写个BT发布索引页,应该很简单,省得去研究别人得代码。
安装 Bittorrent
#apt-get install bittorrent
启动 track
#bttrack –dfile downloadlogfile.txt –port 8099
意思就是启动TRACKER,并在当前目录建立日志文件, downloadlogfile.txt , 设置 端口为8099
以折种方式启动 tracker的话是不论谁都可以拿你的 tracker做服务器的,如果你想限制只允许上传到本站的种子才能用该服务器的话,可以用下面这种方式启动。
#bttrack –port 8099 –show_names l –allowed_dir /mytorrents –dfile downloadlog.txt
这样的话就只对已经上传到本站/mytorrents目录下的种子提供track服务。
track这样就 可以以了,下面的问题就是如何编写发布系统了
思路很简单,上传BT种子到制定的目录,分析BT种子文件,获得文件名,文件大小等信息并插入数据库,这些信息都是很好搞定的。难搞定的是做种人数目, 下载 人数等信息 ,这些数据都是即时的。是直接通过track插入数据库好还是通过PHP 定时查询tracker再在索引页面现实。通过track直接插入数据库的效率肯定要高一点,但觉得这样的即时信息有必要做这样平凡的插入工作么,还不如通过PHP定时查寻track并生成静态页面现时出来。
OK暂时就这么干了!
首先是BT种子文件的分析问题 ,网络上有牛人用PHP编写的两个流传甚广的种子解析文件,
BDecode.php 和BEncode.php.
把这两个文件 include 后
$array=BDecode(path/to/you/down.torrent);
$array返回的是你种子文件信息的数组。
其中$array[”announce-list”]是该种子使用的 tracker 列表
$infohash=sha1(BEncode($array[”info”] )返回数组的 hash信息(hash要用sha1()解码)
$filesize=$array[”info”][”length”]/1048576返回文件大小
如果是用文件夹做的种子,可以通过下面的方法来获得文件大小
获得文件名:$filename = $array[”info”][”name”]
把上面的种子信息整理下就可以放到数据库里面去了
接下来的问题就是BT的即时信息的获得问题啦。
这些信息可以通过向BT服务器发送GET请求来获得
例如假如你用 bittorrent track 的地址是 http://www.mybt.com:8099/announcd
那么你应该向这个地址发送请求:http://www.mybt.com:8099/scrape
要取得一个种子的信息你需要提供种子的info_hash(这在我们分析种子信息时已得到了)
例如: http://www.mybt.com:8099/scrape?info_hash=……………..
一开始我不管怎么样都没办法取回返回信息,在网上逛了好几天才找到答案
原来在分析种子时得到的info_hash 不能直接用与发送GET请求,还需要经过unicode编码
算法如下:
php种可以通过函数很简单得实现
$s = ‘4686AA54744019E3B44C6E8F5E90F47F3E8E87F8′;
$t = pack(’H*’, $s);
$url_hash=urlencode($t);
ok 现在就可以向track 发送请求了。
require_once (”BEncode.php”);
require_once (”BDecode.php”);
$info = BDecode(file_get_contents(”http://www.mybt.com:8099/scrape?info_hash=”.$url_hash));
返回来的$info是一个数组,我们可以从中取得想要的信息
例如:
完成数:$info[’files’][0][’complete’];《/破》
下载数:$info[’files’][addslashes(hex2bin($hash))][’incomplete’];
其中 hex2bin()是一个16进制转2进制的函数,网上有很多的。
核心内容就这么多,扩展起来就很简单了,可以就做一个索应页面,也可以做个强大的发布系统。
这里有一篇比较详细的结合MYSQL 的代码
http://www.norskwebforum.no/pastebin/976
完!
转自疯狂小强的博客
原文地址:
http://my.donews.com/xiaoqiang/2 ... %e9%a1%b5%e3%80%82/
http://my.donews.com/xiaoqiang/2 ... %e4%b8%8b%ef%bc%89/