我花了一点业余时间写一个BitTorrent客户端,主要是出于好奇心,但也有一部分是为了提高我的c#技能。
我使用理论wiki作为指南。我建立了一个处理BEncoding的类库,我对此非常自信;基本上是因为健全性检查是在解析后立即从我的内部表示重新生成原始.torrent文件,然后进行哈希和比较。
下一步是使追踪器公告工作。在这里,我遇到了一个障碍,因为追踪器拒绝我的请求,并没有太有用的错误消息。
例如,最新的堆栈溢出数据库转储。我的代码生成以下公告URI:
就像我说的那样,我相当确定我正在正确地提取信息字典并进行哈希(SHA1),并且对等方ID格式良好。
我猜我正在做一些微小的愚蠢错误,并且希望在发现到底是什么时能得到任何帮助。
很难猜测哪些代码是相关的(而且有太多要发布)。但是,我会尽力发布所需的任何内容。 < p > < em >编辑
我没有对info_hash进行十六进制编码,这有点有帮助。
以下是生成URI并尝试获取响应的代码:
我使用理论wiki作为指南。我建立了一个处理BEncoding的类库,我对此非常自信;基本上是因为健全性检查是在解析后立即从我的内部表示重新生成原始.torrent文件,然后进行哈希和比较。
下一步是使追踪器公告工作。在这里,我遇到了一个障碍,因为追踪器拒绝我的请求,并没有太有用的错误消息。
例如,最新的堆栈溢出数据库转储。我的代码生成以下公告URI:
http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started跟踪器对我的代码的响应:
d14:failure reason32:invalid info hash and/or peer ide将该字符串放入Chrome地址栏中后,跟踪器的响应如下:
d8:completei2e11:external ip13:168.7.249.11110:incompletei0e8:intervali600e5:peersleepeer_id是(有效的)垃圾,但将其更改为有意义的内容(冒充广泛使用的客户端)并没有改变任何东西。
就像我说的那样,我相当确定我正在正确地提取信息字典并进行哈希(SHA1),并且对等方ID格式良好。
我猜我正在做一些微小的愚蠢错误,并且希望在发现到底是什么时能得到任何帮助。
很难猜测哪些代码是相关的(而且有太多要发布)。但是,我会尽力发布所需的任何内容。 < p > < em >编辑
我没有对info_hash进行十六进制编码,这有点有帮助。
以下是生成URI并尝试获取响应的代码:
//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();