#pragma once #include #include #include #include #include #include #include "../multiplex/multiplex_manager.h" using boost::asio::ip::tcp; class SteamNetworkingManager; // TCP Client class class TCPClient { public: TCPClient(const std::string& host, int port, SteamNetworkingManager* manager); ~TCPClient(); bool connect(); void disconnect(); void send(const std::string& message); void send(const char* data, size_t size); void setReceiveCallback(std::function callback); void setReceiveCallback(std::function callback); void setDisconnectCallback(std::function callback); MultiplexManager* getMultiplexManager() { return multiplexManager_.get(); } private: void start_read(std::string id); void handle_read(std::string id, const boost::system::error_code& error, std::size_t bytes_transferred); std::string host_; int port_; bool connected_; bool disconnected_; boost::asio::io_context io_context_; boost::asio::executor_work_guard work_; std::shared_ptr socket_; std::thread clientThread_; std::mutex socketMutex_; std::function receiveCallback_; std::function receiveCallbackBytes_; std::function disconnectCallback_; std::vector buffer_; SteamNetworkingManager* manager_; std::unique_ptr multiplexManager_; };