/*! @file server.hpp Заголовочный файл сервера для игры в лабиринт на базе сокетов. @author ParkSuMin @date 2025.04.30 */ #ifndef SERVER_HPP #define SERVER_HPP #include "maze.hpp" #include #include #include #include #include #include #include /*! Максимальное количество клиентов, которые могут быть в очереди на подключение. */ const int MAX_CLIENTS = 512; /*! Размер буфера для обмена данными между сервером и клиентом. */ const int BUFFER_SIZE = 1024; /*! Класс сервера для игры в лабиринт с использованием сокетов (протокол TCP). */ class Server { private: bool service_mode; ///< Флаг сервисного режима (тестовый режим без ограничения ходов). int server_socket; ///< Серверный сокет для обработки клиентских подключений. /*! Обрабатывает подключение одного клиента. @details Создаёт лабиринт для клиента, принимает команды, обновляет состояние игры и отправляет ответы. @param socket Сокет клиента. @param flag Флаг сервисного режима. @param steps Количество ходов, доступных игроку (игнорируется в сервисном режиме). */ void handle_client(int socket, bool flag, int steps); /*! Проверяет статус игры. @details Проверяет, остались ли ходы у игрока, и активен ли тестовый режим. @param maze Экземпляр объекта класса лабиринта. @return true, если игра продолжается, false — если игра завершена. */ bool check_status(Maze& maze); public: /*! Создаёт экземпляр сервера. @details Инициализирует серверный сокет, связывает его с указанным хостом и портом. @throw std::runtime_error При ошибке создания сокета, получения хоста или привязки. @param host Адрес сервера (название хоста или IP-адрес). @param port Порт сервера для подключения клиентов. */ Server(const std::string& host, const unsigned short port); /*! Запускает сервер. @details Начинает прослушивание входящих подключений и создаёт отдельные потоки для обработки клиентов. @throw std::runtime_error При ошибке прослушивания или принятия соединения. @param steps Количество ходов, доступных каждому игроку. @param service_flag Флаг активации сервисного режима. */ void start(int steps, bool service_flag); }; #endif