2#include <asio/connect.hpp>
3#include <asio/write.hpp>
4#include <asio/ip/udp.hpp>
21 std::function<
void(
const std::vector<unsigned char>&)> callback)
22 : socket(io_service), initialized(false)
29 asio::ip::tcp::resolver::query query(
ip, std::to_string(
port));
30 asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
32 asio::async_connect(
socket, iterator,
34 std::placeholders::_1));
56 std::vector<unsigned char> sized_packet;
57 sized_packet.reserve(msg.size() + 5);
58 ProtocolCraft::WriteData<ProtocolCraft::VarInt>(
static_cast<int>(msg.size()), sized_packet);
59 sized_packet.insert(sized_packet.end(), msg.begin(), msg.end());
64 std::vector<unsigned char> encrypted =
encrypter->Encrypt(sized_packet);
102 LOG_INFO(
"Connection to server established.");
106 std::placeholders::_1, std::placeholders::_2));
110 LOG_ERROR(
"Error when connecting to server. Error code :" << error);
121 std::vector<unsigned char> decrypted(bytes_transferred);
122 std::copy_n(
read_msg.begin(), bytes_transferred, decrypted.data());
123 decrypted =
encrypter->Decrypt(decrypted);
124 for (
int i = 0; i < decrypted.size(); ++i)
131 for (
int i = 0; i < bytes_transferred; ++i)
137 for (
int i = 0; i < bytes_transferred; ++i)
145 std::vector<unsigned char>::const_iterator read_iter =
input_msg.begin();
150 packet_length = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(read_iter, max_length);
152 catch (
const std::runtime_error)
156 const int bytes_read =
static_cast<int>(std::distance<std::vector<unsigned char>::const_iterator>(
input_msg.begin(), read_iter));
157 std::vector<unsigned char> data_packet;
159 if (packet_length > 0 &&
input_msg.size() >= bytes_read + packet_length)
161 data_packet = std::vector<unsigned char>(
input_msg.begin() + bytes_read,
input_msg.begin() + bytes_read + packet_length);
174 std::placeholders::_1, std::placeholders::_2));
189 if (!write_in_progress)
195 std::placeholders::_1));
213 std::placeholders::_1));
229 std::string addressOnly;
233 if (splitted_port.size() > 1)
237 port = std::stoi(splitted_port[1]);
238 ip = splitted_port[0];
241 catch (
const std::exception&)
245 addressOnly = splitted_port[0];
250 addressOnly = address;
255 LOG_INFO(
"Performing SRV DNS lookup on " <<
"_minecraft._tcp." << address <<
" to find an endpoint");
282 std::vector<unsigned char> encoded_query;
283 query.
Write(encoded_query);
284 udp_socket.open(asio::ip::udp::v4());
285 asio::ip::udp::endpoint endpoint(asio::ip::address::from_string(
"8.8.8.8"), 53);
286 udp_socket.send_to(asio::buffer(encoded_query), endpoint);
289 std::vector<unsigned char> answer_buffer(512);
290 asio::ip::udp::endpoint sender_endpoint;
291 const size_t len = udp_socket.receive_from(asio::buffer(answer_buffer), sender_endpoint);
294 size_t remaining = len;
298 answer.
Read(iter, remaining);
302 && answer.
GetAnswers()[0].GetTypeCode() == 0x21)
305 auto iter2 = answer.
GetAnswers()[0].GetRData().begin();
306 size_t len2 = answer.
GetAnswers()[0].GetRDLength();
307 data.
Read(iter2, len2);
315 LOG_INFO(
"SRV DNS lookup successful!");
318 LOG_WARNING(
"SRV DNS lookup failed to find an address");
#define LOG_ERROR(osstream)
#define LOG_WARNING(osstream)
#define LOG_INFO(osstream)
void SetIdentification(const std::vector< unsigned char > &identification_)
void SetFlagOPCode(const char opcode_)
void SetQuestions(const std::vector< DNSQuestion > &questions_)
void SetFlagRA(const char ra_)
void SetFlagQR(const char qr_)
void SetFlagRCode(const char rcode_)
short GetNumberAnswer() const
void SetNumberAdditionalRR(const short number_additional_rr_)
void SetFlagAA(const char aa_)
void SetNumberAnswer(const short number_answer_)
void SetFlagZ(const char z_)
void SetFlagRD(const char rd_)
const std::vector< DNSResourceRecord > & GetAnswers() const
void SetFlagTC(const char tc_)
void SetNumberQuestion(const short number_question_)
void SetNumberAuthority(const short number_authority_)
void SetClassCode(const unsigned short class_code_)
void SetNameLabels(const std::vector< std::string > &name_labels_)
void SetTypeCode(const unsigned short type_code_)
const unsigned short GetPort() const
const std::vector< std::string > & GetNameLabels() const
void UnregisterThread(const std::thread::id id)
Remove a thread from the map.
void RegisterThread(const std::string &name)
Register the current thread in the map.
static Logger & GetInstance()
void SendPacket(const std::vector< unsigned char > &msg)
asio::ip::tcp::socket socket
std::function< void(const std::vector< unsigned char > &)> NewPacketCallback
std::shared_ptr< AESEncrypter > encrypter
TCP_Com(const std::string &address, std::function< void(const std::vector< unsigned char > &)> callback)
void SetEncrypter(const std::shared_ptr< AESEncrypter > encrypter_)
void handle_write(const asio::error_code &error)
void SetIPAndPortFromAddress(const std::string &address)
std::array< unsigned char, 512 > read_msg
std::deque< std::vector< unsigned char > > output_msg
void do_write(const std::vector< unsigned char > &msg)
void handle_connect(const asio::error_code &error)
asio::io_service io_service
void handle_read(const asio::error_code &error, std::size_t bytes_transferred)
bool IsInitialized() const
const std::string & GetIp() const
std::atomic< bool > initialized
const unsigned short GetPort() const
std::vector< unsigned char > input_msg
virtual void Write(WriteContainer &container) const
virtual void Read(ReadIterator &iter, size_t &length)
std::vector< std::string > SplitString(const std::string &s, const char delimiter)
std::vector< unsigned char >::const_iterator ReadIterator