我正在使用C ++开发一个torrent客户端。 我无法理解与同伴的消息结构。 如何使用C ++创建简单的握手消息,如何读取响应? 问题是我必须发送的数据的结构,然后是我必须阅读的结构。 我想向种子发送一个握手消息,发送一个BlockBuf示例。 我如何创建BlockBuf的内容? 问题是我必须使用的结构用于消息而不是对等连接...... :(
答案 0 :(得分:6)
所以BitTorrent handshake按顺序包含:
因此,您可以从获取足够大的缓冲区来获取握手消息:
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
}
等等。
不建议直接从网络读取和编写结构,因为您需要完全控制布局,否则消息将会格式错误。