64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include "ASIO_Utils.h"
|
|
|
|
#include <atomic>
|
|
#include <array>
|
|
#include <chrono>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
namespace Psc::asio_socket {
|
|
|
|
class TCP_Client : public Socket_Base {
|
|
public:
|
|
~TCP_Client() override;
|
|
|
|
void set_buffer_size(size_t size) { max_buffer_size = size; }
|
|
void set_dest_address(const Sockaddr_In& a) { dest_address = a; }
|
|
void create();
|
|
void tick();
|
|
std::string read();
|
|
void send(const std::string& data);
|
|
std::string to_string() override;
|
|
|
|
enum State {
|
|
Not_Created,
|
|
Not_Set_Field,
|
|
Reconnecting,
|
|
Connecting,
|
|
Wait_Check,
|
|
Connected
|
|
};
|
|
|
|
void close() override;
|
|
std::atomic<State> state{Not_Created};
|
|
void set_state(State s);
|
|
std::function<void(State old_state, State new_state)> on_state_change = nullptr;
|
|
|
|
protected:
|
|
size_t max_buffer_size = 1024 * 1024;
|
|
ASIO_StreamRingBuffer send_buffer;
|
|
ASIO_StreamRingBuffer recv_buffer;
|
|
Sockaddr_In dest_address{};
|
|
int reconnect_backoff_ms = 200;
|
|
std::chrono::steady_clock::time_point next_reconnect_tp{};
|
|
|
|
asio::io_context io_context;
|
|
std::unique_ptr<asio::ip::tcp::resolver> resolver;
|
|
std::unique_ptr<asio::ip::tcp::socket> socket;
|
|
std::array<char, 16 * 1024> recv_storage{};
|
|
std::vector<char> send_storage;
|
|
bool connect_pending = false;
|
|
bool read_pending = false;
|
|
bool write_pending = false;
|
|
|
|
void schedule_recreate();
|
|
bool start_connect();
|
|
void start_read();
|
|
void start_write();
|
|
};
|
|
|
|
} // namespace Psc::asio_socket
|