#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct ClientData { int sockd; // Файловый дескриптор соединения. Используем его для обмена данными с клиентом struct sockaddr_in client_sockaddr; // Сведения о клиенте socklen_t client_sockaddr_size; }; class Server { public: Server() = default; int exec(); // Основная функция сервера. Запускает сервер и осуществляет обмен сообщениями private: bool createSocket(); // Функция инициализирует сокет сервера и переводит его в режим ожидания соединений. // Возвращает true, если инициализация удалась, иначе - false; void handleRequest(ClientData* client_data); // Функция обработки соединения с клиентом. Осуществляет обмен данными с конкретным клиентом. private: const uint32_t port = 12346; // Номер порта, по которому происходят соединения читателей const uint32_t max_connections = 1000; // Максимальное количество одновременных соединений int sock; // сокет сервера std::vector clients_readers; // Храним массив с клиентами-читателями, т.к. любой писатель должен знать обо всех читателях std::mutex client_readers_lock; // Используем мьютекс для массива читателей, чтобы исключить одновременные // чтение-запись для массива (например: появление новых читателей // и "публикации" писателей могут происходить одновременно) std::vector clients_threads; // Каждое соединение с сервером обрабатывается в отдельном потоке };