Back to Site
Loading...
Searching...
No Matches
krpc.h
Go to the documentation of this file.
1#pragma once
2
3#include "bencode.h"
4#include "socket.h"
5#include <string>
6#include <vector>
7#include <array>
8#include <memory>
9#include <atomic>
10
11namespace librats {
12
13using NodeId = std::array<uint8_t, 20>;
14using InfoHash = std::array<uint8_t, 20>;
15
19enum class KrpcMessageType {
20 Query,
22 Error
23};
24
28enum class KrpcQueryType {
29 Ping,
33};
34
38enum class KrpcErrorCode {
39 GenericError = 201,
40 ServerError = 202,
41 ProtocolError = 203,
42 MethodUnknown = 204
43};
44
48struct KrpcNode {
50 std::string ip;
51 uint16_t port;
52
53 KrpcNode() : id(), port(0) {}
54 KrpcNode(const NodeId& node_id, const std::string& ip_addr, uint16_t port_num)
55 : id(node_id), ip(ip_addr), port(port_num) {}
56};
57
63 std::string transaction_id;
64
65 // For queries
70 uint16_t port;
71 bool implied_port; // BEP 5: if true, use UDP source port instead of 'port' field
72 std::string token;
73
74 // For responses
76 std::vector<KrpcNode> nodes;
77 std::vector<Peer> peers;
78
79 // For errors
81 std::string error_message;
82
84};
85
90public:
93
97 static KrpcMessage create_ping_query(const std::string& transaction_id, const NodeId& sender_id);
98 static KrpcMessage create_find_node_query(const std::string& transaction_id, const NodeId& sender_id, const NodeId& target_id);
99 static KrpcMessage create_get_peers_query(const std::string& transaction_id, const NodeId& sender_id, const InfoHash& info_hash);
100 static KrpcMessage create_announce_peer_query(const std::string& transaction_id, const NodeId& sender_id, const InfoHash& info_hash, uint16_t port, const std::string& token, bool implied_port = false);
101
102 static KrpcMessage create_ping_response(const std::string& transaction_id, const NodeId& response_id);
103 static KrpcMessage create_find_node_response(const std::string& transaction_id, const NodeId& response_id, const std::vector<KrpcNode>& nodes);
104 static KrpcMessage create_get_peers_response(const std::string& transaction_id, const NodeId& response_id, const std::vector<Peer>& peers, const std::string& token);
105 static KrpcMessage create_get_peers_response_with_nodes(const std::string& transaction_id, const NodeId& response_id, const std::vector<KrpcNode>& nodes, const std::string& token);
106 static KrpcMessage create_announce_peer_response(const std::string& transaction_id, const NodeId& response_id);
107
108 static KrpcMessage create_error(const std::string& transaction_id, KrpcErrorCode error_code, const std::string& error_message);
109
113 static std::vector<uint8_t> encode_message(const KrpcMessage& message);
114 static std::unique_ptr<KrpcMessage> decode_message(const std::vector<uint8_t>& data);
115
119 static std::string generate_transaction_id();
120
124 static std::string node_id_to_string(const NodeId& id);
125 static NodeId string_to_node_id(const std::string& str);
126 static std::string compact_peer_info(const Peer& peer);
127 static std::string compact_node_info(const KrpcNode& node);
128 static std::vector<Peer> parse_compact_peer_info(const std::string& compact_info);
129 static std::vector<KrpcNode> parse_compact_node_info(const std::string& compact_info);
130
131private:
132 static BencodeValue encode_query(const KrpcMessage& message);
133 static BencodeValue encode_response(const KrpcMessage& message);
134 static BencodeValue encode_error(const KrpcMessage& message);
135
136 static std::unique_ptr<KrpcMessage> decode_query(const BencodeValue& data);
137 static std::unique_ptr<KrpcMessage> decode_response(const BencodeValue& data);
138 static std::unique_ptr<KrpcMessage> decode_error(const BencodeValue& data);
139
140 static KrpcQueryType string_to_query_type(const std::string& str);
141 static std::string query_type_to_string(KrpcQueryType type);
142
143 static std::atomic<uint32_t> transaction_counter_;
144};
145
146} // namespace librats
Represents a bencoded value which can be:
Definition bencode.h:33
KRPC Protocol implementation.
Definition krpc.h:89
static std::vector< Peer > parse_compact_peer_info(const std::string &compact_info)
static KrpcMessage create_error(const std::string &transaction_id, KrpcErrorCode error_code, const std::string &error_message)
static KrpcMessage create_find_node_query(const std::string &transaction_id, const NodeId &sender_id, const NodeId &target_id)
static KrpcMessage create_get_peers_response_with_nodes(const std::string &transaction_id, const NodeId &response_id, const std::vector< KrpcNode > &nodes, const std::string &token)
static KrpcMessage create_announce_peer_response(const std::string &transaction_id, const NodeId &response_id)
static KrpcMessage create_find_node_response(const std::string &transaction_id, const NodeId &response_id, const std::vector< KrpcNode > &nodes)
static std::string compact_peer_info(const Peer &peer)
static KrpcMessage create_ping_query(const std::string &transaction_id, const NodeId &sender_id)
Create KRPC messages.
static std::vector< KrpcNode > parse_compact_node_info(const std::string &compact_info)
static std::string compact_node_info(const KrpcNode &node)
static std::string generate_transaction_id()
Generate transaction ID.
static std::unique_ptr< KrpcMessage > decode_message(const std::vector< uint8_t > &data)
static KrpcMessage create_ping_response(const std::string &transaction_id, const NodeId &response_id)
static std::vector< uint8_t > encode_message(const KrpcMessage &message)
Encode/decode KRPC messages.
static KrpcMessage create_announce_peer_query(const std::string &transaction_id, const NodeId &sender_id, const InfoHash &info_hash, uint16_t port, const std::string &token, bool implied_port=false)
static NodeId string_to_node_id(const std::string &str)
static std::string node_id_to_string(const NodeId &id)
Utility functions.
static KrpcMessage create_get_peers_response(const std::string &transaction_id, const NodeId &response_id, const std::vector< Peer > &peers, const std::string &token)
static KrpcMessage create_get_peers_query(const std::string &transaction_id, const NodeId &sender_id, const InfoHash &info_hash)
KrpcMessageType
KRPC Message types.
Definition krpc.h:19
KrpcQueryType
KRPC Query types.
Definition krpc.h:28
KrpcErrorCode
KRPC Error codes.
Definition krpc.h:38
std::array< uint8_t, NODE_ID_SIZE > InfoHash
Definition dht.h:50
std::array< uint8_t, NODE_ID_SIZE > NodeId
Definition dht.h:49
KRPC Message structure.
Definition krpc.h:61
uint16_t port
Definition krpc.h:70
std::vector< Peer > peers
Definition krpc.h:77
NodeId sender_id
Definition krpc.h:67
std::string transaction_id
Definition krpc.h:63
InfoHash info_hash
Definition krpc.h:69
KrpcErrorCode error_code
Definition krpc.h:80
KrpcMessageType type
Definition krpc.h:62
std::vector< KrpcNode > nodes
Definition krpc.h:76
NodeId response_id
Definition krpc.h:75
KrpcQueryType query_type
Definition krpc.h:66
std::string token
Definition krpc.h:72
std::string error_message
Definition krpc.h:81
NodeId target_id
Definition krpc.h:68
KRPC Node information.
Definition krpc.h:48
NodeId id
Definition krpc.h:49
uint16_t port
Definition krpc.h:51
std::string ip
Definition krpc.h:50
KrpcNode(const NodeId &node_id, const std::string &ip_addr, uint16_t port_num)
Definition krpc.h:54
UDP peer information.
Definition socket.h:42