Files
CPP_Core/Core/socket/TCP_Client.h
T
2026-06-23 09:35:27 +08:00

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