#pragma once #include #include #include #include #include #include #include #include "ASIO_Utils.h" 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(std::string_view data); std::string to_string() override; enum State { Not_Created, Not_Set_Field, Reconnecting, Connecting, Wait_Check, Connected }; void close() override; std::atomic state{Not_Created}; void set_state(State s); std::function 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 resolver; std::unique_ptr socket; std::array recv_storage{}; std::vector 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