#pragma once #include #include #include #include #include #include #include #include #include #include #include "../multiplex/multiplex_manager.h" class SteamNetworkingManager; using boost::asio::ip::tcp; // TCP Server class class TCPServer { public: TCPServer(int port, SteamNetworkingManager* manager); ~TCPServer(); bool start(); void stop(); void sendToAll(const std::string& message, std::shared_ptr excludeSocket = nullptr); void sendToAll(const char* data, size_t size, std::shared_ptr excludeSocket = nullptr); int getClientCount(); MultiplexManager* getMultiplexManager() { return multiplexManager_.get(); } private: void start_accept(); void start_read(std::shared_ptr socket, std::string id); int port_; bool running_; boost::asio::io_context io_context_; boost::asio::executor_work_guard work_; tcp::acceptor acceptor_; std::vector> clients_; std::mutex clientsMutex_; std::thread serverThread_; SteamNetworkingManager* manager_; std::unique_ptr multiplexManager_; };