[搜片神器]直接从DHT网络下载BT种子的方法

  转自:http://www.cnblogs.com/miao31/p/3332819.html

  DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO

  数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr

  1.[搜片神器] 之P2P中DHT网络爬虫原理

  2.[搜片神器]之DHT网络爬虫的代码实现方法

  3.[搜片神器]之DHT网络爬虫的C++程序初步开源

  --------------------------------------------------------------------------------------------------------------------

  在介绍了这么多期文章后,最后介绍BT网络里面一个比较重要种子下载协议,方便大家知道如何从DHT网络直接下载种子的问题.

  先说下我们目前下载电影等文件是如何下载的,比如我们有个BT种子,就可以去下载对应的文件,但如果我们只有个文件名字,如何去找BT种子呢?

  首先我们可以去?http://h31bt.com?去通过搜索得到磁连接,然后就由此字符串去下载对应的种子文件和电影等信息,但如果没有网站让你下载种子,我们又当如何去搜索这个种子呢?

  通过HTTP直接从WEB服务器上下载,这种直接方便,比如从迅雷服务器上下载种子,再就是通过BT软件从网络里面去获取BT网络里面专门有个下载种子的协议文件,只能下载种子,然后种子下载好后就可以交给BT软件来下载数据了. 如何从DHT网络下载种子,必须先看两个协议文章:

  http://www.bittorrent.org/beps/bep_0009.html

  http://www.bittorrent.org/beps/bep_0010.html

  这里面有介绍,但还是需要说明一下如何操作的流程方便大家更好的理解.

  我们的代码流程必须还是基于?DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO?之上,因为是从DHT网络里面获取数据,

  需要我们在此之上操作后续流程.

  之前的DHT有SEARCH的相关代码来搜索这个HASH对应的哪些IP在提供下载.

  搜索到对方返回的IP信息和端口号后,大家可以分析dht.c里面的函数代码dht_periodic(const void *buf, size_t buflen,const struct sockaddr *fromAddr, int fromlen,time_t *tosleep,dht_callback *callback, void *closure)函数里面的ANNOUNCE_PEER返回请求里面带有对方表明自己此BT种子对应的认证码peerid.

  知道了对应的IP,端口号,还有种子ID号,就可以向对方发送请求了.

  获取HASH是通过UDP网络,但下载BT种子是通过TCP来处理,相当于别人是TCP服务器,我们连接过去,直接下载对应PEERID的种子就行了.

  先看http://www.bittorrent.org/beps/bep_0010.html协议介绍,我们必须先握手

  handshake message

  此包构造比较简单,按照格式进行组装就行了,然后发送出去,对方就会回应自己是什么客户端的软件提供种子下载.

  在发送握手后,我们可以接着发送种子数据请求包,需要学习http://www.bittorrent.org/beps/bep_0009.html 里面的内容:

  这就需要会bencode的相关代码,这个大家可以网上搜索进行编译,如果实现搞不定,可以留下邮箱我将此类代码发送给你,其实也是网上收集整理的.

  如果别人回应的是3,那就直接退出吧,说明别人拒绝了你.

  如果回应是2,则返回的是数据区,每块是16K大小,最后一包不是.

  下面给出如何进行提交我需要第几包的数据代码:

  在接收到一包请求后我们才可以继续下一包的请求,下面给了我们如何解析这一包的问题代码:

  第一次调试也很天真的等着DHT网络上的数据过来,需要等很久,而且调试总是发现别人不回应,要么就是拒绝,经过一段时间后,

  问朋友总是不对问题,结果是协议没有构造对.下面就需要注意的地方总结下:

  1.一定要接收到别的人PEERID后才能够与别人交流,不然别人肯定不理你;

  2.构造协议调试不能够在外网络上调试,最好大家将mono-monotorrent源代码下载回来,调试分析下,本地开启服务器;

  3.通过本地与mono-monotorrent进行调试,你就可以分析出是哪里不对的问题,是不是协议哪些封装得不对的问题.

  4.通过DHT网络下载回来的种子肯定是最新的,WEB下载的可能还没有呢..

  5.通过协议下载回来的种子好像没有announce-list,不知道为什么不提供一些内容,可能还有些什么关键地方没有下载,分析mono-monotorrent代码里面就是不提供下载,希望高手指点.

  6.TCPClient接收数据区需要开到16K以上,这样方便处理,当然如果会前后拼接包就更好.

  7.如果需要bencode相关的编码C++代码,可以在此留言或者给h31h31#163.com发邮件.

  如果此文章看不太明白,请先看看之前的文章,分析调试下代码,再来学习此文章可能就比较懂一些.

  希望有了解的朋友更好的交流和进步.在此留言学习讨论.

  大家看累了,就移步到娱乐区http://h31bt.com?去看看,休息下...

  本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3333072.html,如需转载请自行联系原作者