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
84
89public:
92
96 static KrpcMessage create_ping_query(const std::string& transaction_id, const NodeId& sender_id);
97 static KrpcMessage create_find_node_query(const std::string& transaction_id, const NodeId& sender_id, const NodeId& target_id);
98 static KrpcMessage create_get_peers_query(const std::string& transaction_id, const NodeId& sender_id, const InfoHash& info_hash);
99 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);
100
101 static KrpcMessage create_ping_response(const std::string& transaction_id, const NodeId& response_id);
102 static KrpcMessage create_find_node_response(const std::string& transaction_id, const NodeId& response_id, const std::vector<KrpcNode>& nodes);
103 static KrpcMessage create_get_peers_response(const std::string& transaction_id, const NodeId& response_id, const std::vector<Peer>& peers, const std::string& token);
104 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);
105 static KrpcMessage create_announce_peer_response(const std::string& transaction_id, const NodeId& response_id);
106
107 static KrpcMessage create_error(const std::string& transaction_id, KrpcErrorCode error_code, const std::string& error_message);
108
112 static std::vector<uint8_t> encode_message(const KrpcMessage& message);
113 static std::unique_ptr<KrpcMessage> decode_message(const std::vector<uint8_t>& data);
114
118 static std::string generate_transaction_id();
119
123 static std::string node_id_to_string(const NodeId& id);
124 static NodeId string_to_node_id(const std::string& str);
125 static std::string compact_peer_info(const Peer& peer);
126 static std::string compact_node_info(const KrpcNode& node);
127 static std::vector<Peer> parse_compact_peer_info(const std::string& compact_info);
128 static std::vector<KrpcNode> parse_compact_node_info(const std::string& compact_info);
129
130private:
131 static BencodeValue encode_query(const KrpcMessage& message);
132 static BencodeValue encode_response(const KrpcMessage& message);
133 static BencodeValue encode_error(const KrpcMessage& message);
134
135 static std::unique_ptr<KrpcMessage> decode_query(const BencodeValue& data);
136 static std::unique_ptr<KrpcMessage> decode_response(const BencodeValue& data);
137 static std::unique_ptr<KrpcMessage> decode_error(const BencodeValue& data);
138
139 static KrpcQueryType string_to_query_type(const std::string& str);
140 static std::string query_type_to_string(KrpcQueryType type);
141
142 static std::atomic<uint32_t> transaction_counter_;
143};
144
145} // namespace librats
Represents a bencoded value which can be:
Definition bencode.h:33
KRPC Protocol implementation.
Definition krpc.h:88
static std::vector< Peer > parse_compact_peer_info(const std::string &compact_info)
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)
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 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:76
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:79
KrpcMessageType type
Definition krpc.h:62
std::vector< KrpcNode > nodes
Definition krpc.h:75
NodeId response_id
Definition krpc.h:74
KrpcQueryType query_type
Definition krpc.h:66
std::string token
Definition krpc.h:71
std::string error_message
Definition krpc.h:80
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:33