【问题标题】:BitTorrent Peer Wire messages in C++C++ 中的 BitTorrent Peer Wire 消息
【发布时间】:2012-03-23 18:25:10
【问题描述】:

我正在使用 C++ 开发一个 torrent 客户端。 我无法理解与同行的消息结构。 如何使用 C++ 创建简单的握手消息以及如何读取响应? 问题是我必须发送的数据结构,然后是我必须读取的结构。 我想向种子发送握手消息,例如发送 BlockBuf。 我必须如何创建 BlockBuf 的内容? 问题是我必须用于消息的结构而不是点对点连接.... :(

【问题讨论】:

  • 您提出了多个问题,但没有显示任何代码来定义问题的原因,请发布您的代码。
  • 我在军队时正在开发洪流应用程序。现在我放假了,我没有开发计算机,所以我现在没有可用的代码。我也没有访问权限我在军队时上网!:P 所以我认为这是一个僵局,我不能发布任何代码!主要问题是用 C++ 编写的握手消息示例。
  • BitTorrent 规范的哪一部分不清楚?对等消息的结构相当简单——定义一个类来保存数据并从中生成流并不难。
  • ..或者,在接收时,将字节推送到实例中,直到协议单元完成。
  • 我无法理解消息流。例如这样的握手消息。|char:19||char[19]BitTorrent 协议|long:reserved|char[20]:hash|char[20 ]:peer_id|是正确的?我有这些值是一个 BlockBuf 变量。我还有一个结构,它是这个 BlockBuf 的视图,以便修改 BlockBuf 的一部分。

标签: c++ p2p bittorrent


【解决方案1】:

所以BitTorrent handshake 由以下部分组成:

  1. 一个值为 19 的字节(后面的字符串的长度);
  2. UTF-8 字符串“BitTorrent 协议”(与 ASCII 相同);
  3. 8 个保留字节用于标记扩展;
  4. 种子信息哈希的 20 个字节;
  5. peer ID 的 20 个字节。

因此,您可以先获取一个足够大的缓冲区来容纳握手消息:

const int handshake_size = 1+19+8+20+20;
char handshake[handshake_size];

预先计算偏移量也有帮助:

const int protocol_name_offset = 1;
const int reserved_offset = protocol_name_offset + 19;
const int info_hash_offset = reserved_offset + 8;
const int peer_id_offset = info_hash_offset + 20;

然后你只需要把它填满。

const char prefix = 19;
const std::string BitTorrent_protocol = "BitTorrent protocol";

handshake[0] = prefix; // length prefix of the string
std::copy(BitTorrent_protocol.begin(), BitTorrent_protocol.end(),
          &handshake[protocol_name_offset]); // protocol name

其余数据以此类推。

然后可以将缓冲区直接发送到您将使用的任何网络 API。

要读取回复,您需要提取缓冲区的各个部分并进行相应的验证:

if(reply[0] != prefix) {
    // fail
}
if(!std::equal(BitTorrent_protocol.begin(), BitTorrent_protocol.end(), &reply[protocol_name_offset]) {
    // fail 
}

等等。

不建议直接从网络读写结构,因为您需要完全控制布局,否则消息会出现格式错误。

【讨论】:

  • 感谢您的完整回答!您的实现与我的相似!发送该消息后,您从 torrent 客户端得到什么响应?
  • 规范中描述的@nikosdi:回复是另一条具有相同格式的消息。
  • @R.MartinhoFernandes 计算偏移量的好技巧。投票赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多