从tracker上获取peer列表

王朝vc·作者佚名  2006-01-09
宽屏版  字体: |||超大  

从torrent文件中得到了tracker列表后,接下来的工作就是获取peer列表.

tracker使用http协议.客户端向服务器发送标准的GET请求,就可以得到这个列表.tracker返回的信息是bencode编码.

向tracker发送的GET请求有如下一些参数:

info_hash(必须):

torrent文件中info字段的sha1.torrent文件解析器中已经计算此值,保存在CTorrentParser的m_Infohash成员中.

peer_id(必须):

节点ID,长20字节.通常每一个下载产生一个相应的ID.通过peer_id可以识别大多数客户端类型.

ip(可选):

客户端指定的期望其他节点与本地交互时连接的IP.一般来说不用指定此参数,除非客户端使用了代理或者端口映射.

port(可选):

本地侦听的端口.

uploaded:

已经上传的字节数.

download:

已经下载的字节数.

left:

未下载的字节数.

event(可选):

此参数可以是如下的值:

started:下载开始

completed:下载完毕

stopped:下载停止

compact(可选):

此参数值为1,表示期望得到紧凑模式的节点列表.

否则表示期望得到普通模式的节点列表.

no_peer_id(可选):

其值为1,表示不需要节点id信息.

通常tracker会返回错误代码200.

如果返回的bencode编码中包含failure reason字段,则表示处理请求失败,此字段的值即为失败原因.

如果请求成功,则有两个字段是必须出现的:

peers:节点列表

interval:服务器期望的下次查询间隔时间,单位为秒

通常还会有如下一些字段出现:

done peers:下载完毕的节点个数

num peers或者incomplete: 当前下载的节点个数

普通模式的回复其peers字段包括ip,port两个字段,如果未指定no_peer_id参数还将包括peer id字段.

下面是普通模式的回复例子:

d8:intervali3600e5:peersld2:ip13:192.168.24.527:peer id20:{peer_id}4:porti2001eed2:ip11:192.168.0.37:peer id20:{peer_id}4:porti6889eeee

d8:intervali3600e5:peersld2:ip13:192.168.24.524:porti2001eed2:ip11:192.168.0.34:porti6889eeee

紧凑模式的回复其peers字段是一个如下结构的数组:

struct PEER

{

DWORD IP;//节点IP

WORD Port;//节点端口

};

例如:192.168.24.52:2001 => 0xC0 0xA8 0x18 0x34 0xD1 0x07

下面是紧凑模式的回复例子:

d8:intervali3600e5:peers12:{12 characters of binary data}e

[url=http://www.easeso.com]逸搜(EaseSo)(EaseSo)论坛有一个从tracker获取peer列表的测试程序BTTrackerTest.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有