Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. ПСП
  3. Практика
  4. Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Слайды
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Регистрация в JupyterHub
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Формы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
      • Практика
        • Программное обеспечение
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Обзор базовых конструкций и основных элементов языка”
        • Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”
        • Лаб. работа “Типы исключительных ситуаций и процесс их обработки”
        • Лаб. работа “Потоки ввода/вывода и работа с файлами”
        • Лаб. работа “Организация потоков, параллельной обработки, синхронизации и распределённой обработки синхронизуемых участков кода”
        • Лаб. работа “Структурные механизмы языка программирования для реализации полиморфизма в программах”
        • Лаб. работа “Средства языка для организации работы в сети. Основные классы и интерфейсы реализации сетевого взаимодействия”
        • Лаб. работа “Библиотеки и средства внедрения визуальных компонент для организации GUI-интерфейсов пользователя. Обработка событий”
        • Лаб. работа “Концепция распределённой обработки данных и технологии удалённой обработки данных”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Слайды
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Линейное программирование”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Слайды
      • Слайды
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Цель работы
  • Теоретические сведения
    • Класс и объект
    • Инкапсуляция
    • Модификаторы доступа
    • Конструкторы и деструктор
    • Наследование
    • Взаимодействие объектов
  • Задание для выполнения
    • Требования к программе
    • Пример ожидаемого вывода
  • Индивидуальные задания
    • Вариант 1. Почтовые серверы
    • Вариант 2. Сетевые сканеры уязвимостей
    • Вариант 3. Сетевые принтеры
    • Вариант 4. Веб-серверы
    • Вариант 5. Базы данных
    • Вариант 6. VPN-шлюзы
    • Вариант 7. IoT-устройства
    • Вариант 8. DNS-серверы
    • Вариант 9. Файловые серверы
    • Вариант 10. Фаерволы
    • Вариант 11. Прокси-серверы
    • Вариант 12. Сетевые камеры
    • Вариант 13. Балансировщики нагрузки
    • Вариант 14. Сетевые хранилища
    • Вариант 15. Контейнеры Docker
    • Вариант 16. Сетевые сервисы
    • Вариант 17. Сетевые адаптеры
    • Вариант 18. Антивирусные шлюзы
    • Вариант 19. Серверы видеоконференций
    • Вариант 20. Системы мониторинга
  • Порядок выполнения
  • Контрольные вопросы
  • Содержание отчёта
  1. ИСиТ
  2. ПСП
  3. Практика
  4. Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”

Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”

Программирование сетевых приложений
Практика
Автор

Бизюк Андрей

Дата публикации

9 апреля 2026 г.

Цель работы

Изучить принципы инкапсуляции и наследования в C++ путём разработки иерархии классов для моделирования участников сетевого взаимодействия. Освоить создание общего интерфейса через наследование и организацию взаимодействия между объектами-клиентами и объектом-сервером.

Теоретические сведения

Класс и объект

Класс — пользовательский тип данных, объединяющий данные (поля) и методы для их обработки. Объект — конкретный экземпляр класса.

class Client {
private:
    string ip;
    int port;
    bool connected;
public:
    Client(const string& ip, int port);
    void connect();
    void disconnect();
    bool isConnected() const;
};

Инкапсуляция

Инкапсуляция — сокрытие внутренних данных объекта и предоставление контролируемого доступа через методы:

class Client {
private:
    string ip;         // закрытый доступ
    int port;
protected:
    string protocol;   // доступ в производных классах
public:
    string getIp() const { return ip; }
    void setIp(const string& newIp) { ip = newIp; }
};

Модификаторы доступа

Модификатор Доступ из класса Доступ из производного Доступ извне
private Да Нет Нет
protected Да Да Нет
public Да Да Да

Конструкторы и деструктор

class Client {
public:
    Client() : ip("0.0.0.0"), port(0), connected(false) {}
    Client(const string& ip, int port) : ip(ip), port(port), connected(false) {}
    ~Client();  // деструктор
};

Наследование

Наследование позволяет создавать новые классы на основе существующих:

class NetworkClient : public Client {
private:
    string protocol;
    int timeout;
public:
    NetworkClient(const string& ip, int port, const string& proto);
    void send(const string& data);
    string receive();
};

Взаимодействие объектов

class Server {
private:
    vector<NetworkClient*> clients;
public:
    void registerClient(NetworkClient* client);
    void broadcast(const string& message);
};

Задание для выполнения

Разработать иерархию классов для моделирования участников сетевого взаимодействия: базовый абстрактный класс «Клиент» и производные от него «TCP-клиент», «UDP-клиент», «WebSocket-клиент», а также класс «Сервер» для управления подключениями.

Требования к программе

  1. Создать абстрактный базовый класс NetworkClient:
    • закрытые поля: ip (string), port (int), connected (bool)
    • защищённые поля: clientName (string), protocol (string)
    • открытые методы: конструктор с параметрами, виртуальный деструктор, connect(), disconnect(), isConnected(), геттеры для IP и порта
    • чисто виртуальные методы: send(const string& data), receive(), getProtocolName()
  2. Создать производные классы:
    • TcpClient — дополнительно: timeout (int). Метод send() выводит [TCP] Отправка с гарантией доставки: <data>. Метод receive() возвращает имитацию полученного ответа.
    • UdpClient — дополнительно: packetSize (int). Метод send() выводит [UDP] Быстрая отправка датаграммы: <data>. Метод receive() — имитация приёма датаграммы.
    • WebSocketClient — дополнительно: url (string). Метод send() выводит [WS] Отправка через WebSocket: <data>. Метод receive() — имитация двунаправленного обмена.
  3. Создать класс Server:
    • закрытые поля: serverIp, serverPort, список подключённых клиентов (vector<NetworkClient*>)
    • методы: addClient(NetworkClient*), removeClient(const string& name), broadcast(const string& message) — вызывает send() для всех подключённых клиентов, listClients() — выводит информацию о всех клиентах, getClientInfo(const string& name) — выводит информацию о конкретном клиенте
  4. В функции main():
    • Создать объект Server
    • Создать объекты каждого типа клиента и подключить их к серверу
    • Продемонстрировать отправку сообщений через каждого клиента
    • Продемонстрировать метод broadcast() сервера
    • Вывести список всех клиентов
    • Отключить одного клиента и повторить вывод списка

Пример ожидаемого вывода

=== Подключение клиентов ===
[Server] Клиент WebApp подключен (TCP, 192.168.1.10:8080)
[Server] Клиент SensorHub подключен (UDP, 192.168.1.20:9090)
[Server] Клиент ChatPanel подключен (WS, 192.168.1.30:443)

=== Отправка сообщений ===
[TCP] Отправка с гарантией доставки: GET /api/data
[UDP] Быстрая отправка датаграммы: temperature:25.5
[WS] Отправка через WebSocket: {"action":"subscribe"}

=== Broadcast сервера ===
[TCP] Отправка с гарантией доставки: Системное уведомление: перезагрузка
[UDP] Быстрая отправка датаграммы: Системное уведомление: перезагрузка
[WS] Отправка через WebSocket: Системное уведомление: перезагрузка

=== Список клиентов ===
1. WebApp    | TCP | 192.168.1.10:8080 | Подключен
2. SensorHub | UDP | 192.168.1.20:9090 | Подключен
3. ChatPanel | WS  | 192.168.1.30:443  | Подключен

=== Отключение клиента ===
[Server] Клиент SensorHub отключен

=== Обновленный список ===
1. WebApp    | TCP | 192.168.1.10:8080 | Подключен
2. ChatPanel | WS  | 192.168.1.30:443  | Подключен

Индивидуальные задания

Вариант 1. Почтовые серверы

Базовый абстрактный класс MailServer:

  • закрытые поля: domain (string), port (int), sslEnabled (bool)
  • защищённые поля: provider (string), protocol (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, start(), stop(), isRunning(), геттеры
  • чисто виртуальные методы: sendMail(), checkMail(), getServerType()

Производные классы:

  • SMTPServer — дополнительно: mailLimit (int). Метод sendMail() выводит [SMTP] Отправка через <domain>:<port>.
  • POP3Server — дополнительно: mailboxCount (int). Метод checkMail() выводит [POP3] Проверка <n> ящиков на <domain>.
  • IMAPServer — дополнительно: folderSupport (bool). Метод checkMail() выводит [IMAP] Синхронизация папок на <domain>.

Класс MailManager:

  • закрытые поля: managerName, vector<MailServer*> servers
  • методы: addServer(), broadcast(const string& notice), listServers(), removeServer()

Вариант 2. Сетевые сканеры уязвимостей

Базовый абстрактный класс VulnScanner:

  • закрытые поля: ip (string), targetRange (string), status (bool), scanCount (int)
  • защищённые поля: scannerName (string), scanType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, start(), stop(), isRunning(), геттеры
  • чисто виртуальные методы: scan(const string& target), getResults(), getScannerTypeName()

Производные классы:

  • PortScanner — дополнительно: portRange (string). Метод scan() выводит [PortScan] Сканирование портов: <target>. Метод detectServices() — обнаружение сервисов.
  • WebScanner — дополнительно: depth (int). Метод scan() выводит [WebScan] Анализ: <target>. Метод checkXSS() — проверка на XSS.
  • NetScanner — дополнительно: subnetMask (string). Метод scan() выводит [NetScan] Обзор сети: <target>. Метод mapTopology() — построение топологии.

Класс SecurityAudit:

  • закрытые поля: auditName, vector<VulnScanner*> scanners
  • методы: addScanner(), removeScanner(), scanAll(), listScanners(), getScannerInfo()

Вариант 3. Сетевые принтеры

Базовый абстрактный класс Printer:

  • закрытые поля: ip (string), model (string), status (bool), tonerLevel (int)
  • защищённые поля: printerName (string), type (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, powerOn(), powerOff(), isOnline(), геттеры
  • чисто виртуальные методы: print(const string& document), getSpecs(), getTypeName()

Производные классы:

  • LaserPrinter — дополнительно: printSpeed (int стр/мин). Метод print() выводит [Laser] Печать: <document>. Метод printPage() — печать страницы.
  • InkjetPrinter — дополнительно: colorSupport (bool). Метод print() выводит [Inkjet] Печать: <document>. Метод printPhoto() — печать фото.
  • LabelPrinter — дополнительно: tapeWidth (int). Метод print() выводит [Label] Печать этикетки: <document>. Метод printLabel() — печать этикетки.

Класс PrintOffice:

  • закрытые поля: officeName, vector<Printer*> printers
  • методы: addPrinter(), removePrinter(), printAll(const string& doc), listPrinters(), getPrinterInfo()

Вариант 4. Веб-серверы

Базовый абстрактный класс WebServer:

  • закрытые поля: ip (string), port (int), os (string), status (bool)
  • защищённые поля: serverName (string), engine (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, boot(), shutdown(), isRunning(), геттеры
  • чисто виртуальные методы: handleRequest(const string& request), getInfo(), getEngineName()

Производные классы:

  • ApacheServer — дополнительно: version (string), configPath (string). Метод handleRequest() выводит [Apache] Обработка: <request>. Метод restart() — перезапуск.
  • NginxServer — дополнительно: workerProcesses (int). Метод handleRequest() выводит [Nginx] Обработка: <request>. Метод reloadConfig() — перезагрузка конфигурации.
  • IIServer — дополнительно: appPoolCount (int). Метод handleRequest() выводит [IIS] Обработка: <request>. Метод deployApp() — развёртывание приложения.

Класс ServerFarm:

  • закрытые поля: farmName, vector<WebServer*> servers
  • методы: addServer(), removeServer(), deployToAll(), listServers(), getServerInfo()

Вариант 5. Базы данных

Базовый абстрактный класс Database:

  • закрытые поля: dbName (string), host (string), port (int), status (bool)
  • защищённые поля: instanceName (string), dbType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, connect(), disconnect(), isConnected(), геттеры
  • чисто виртуальные методы: execute(const string& sql), getStats(), getTypeName()

Производные классы:

  • MySQL — дополнительно: version (string). Метод execute() выводит [MySQL] Выполнение: <sql>. Метод query() — выполнение запроса.
  • PostgreSQL — дополнительно: extensions (vector<string>). Метод execute() выводит [PostgreSQL] Выполнение: <sql>. Метод backup() — создание резервной копии.
  • SQLite — дополнительно: dbFilePath (string). Метод execute() выводит [SQLite] Выполнение: <sql>. Метод optimize() — оптимизация БД.

Класс DBCluster:

  • закрытые поля: clusterName, vector<Database*> databases
  • методы: addDatabase(), removeDatabase(), executeOnAll(), listDatabases(), getDatabaseInfo()

Вариант 6. VPN-шлюзы

Базовый абстрактный класс VPNGateway:

  • закрытые поля: ip (string), protocol (string), country (string), status (bool)
  • защищённые поля: gatewayName (string), vpnType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, activate(), deactivate(), isActive(), геттеры
  • чисто виртуальные методы: handleConnection(const string& target), getDetails(), getTypeName()

Производные классы:

  • OpenVPN — дополнительно: listenPort (int). Метод handleConnection() выводит [OpenVPN] Подключение к: <target>. Метод connect() — установка соединения.
  • WireGuard — дополнительно: publicKey (string). Метод handleConnection() выводит [WireGuard] Туннель к: <target>. Метод tunnel() — создание туннеля.
  • IPSecVPN — дополнительно: cipher (string). Метод handleConnection() выводит [IPSec] Установка туннеля к: <target>. Метод establish() — установка защищённого соединения.

Класс VPNManager:

  • закрытые поля: managerName, vector<VPNGateway*> gateways
  • методы: addGateway(), removeGateway(), connectAll(const string& target), listGateways(), getGatewayInfo()

Вариант 7. IoT-устройства

Базовый абстрактный класс IoTDevice:

  • закрытые поля: deviceId (string), ip (string), deviceType (string), status (bool)
  • защищённые поля: deviceName (string), category (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, registerDevice(), unregisterDevice(), isRegistered(), геттеры
  • чисто виртуальные методы: performAction(const string& command), getDeviceInfo(), getCategoryName()

Производные классы:

  • TemperatureSensor — дополнительно: currentReading (double), threshold (double). Метод performAction() выводит [TempSensor] Команда: <command>. Метод readValue() — получение показаний.
  • SmartLamp — дополнительно: brightness (int), color (string). Метод performAction() выводит [SmartLamp] Команда: <command>. Метод toggle() — переключение состояния.
  • SecurityCamera — дополнительно: resolution (string). Метод performAction() выводит [Camera] Команда: <command>. Метод record() — начало записи.

Класс SmartHome:

  • закрытые поля: homeName, vector<IoTDevice*> devices
  • методы: addDevice(), removeDevice(), sendCommandToAll(), listDevices(), getDeviceInfo()

Вариант 8. DNS-серверы

Базовый абстрактный класс DNSServer:

  • закрытые поля: ip (string), domain (string), serverType (string), status (bool)
  • защищённые поля: serverName (string), dnsRole (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, start(), stop(), isRunning(), геттеры
  • чисто виртуальные методы: resolve(const string& hostname), getConfig(), getRoleName()

Производные классы:

  • PrimaryDNS — дополнительно: zones (vector<string>). Метод resolve() выводит [Primary] Разрешение: <hostname>. Метод addRecord() — добавление записи.
  • SecondaryDNS — дополнительно: masterServer (string). Метод resolve() выводит [Secondary] Разрешение: <hostname>. Метод sync() — синхронизация с мастером.
  • CachingDNS — дополнительно: cacheSize (int). Метод resolve() выводит [Cache] Разрешение: <hostname>. Метод lookup() — поиск в кэше.

Класс DNSManager:

  • закрытые поля: managerName, vector<DNSServer*> servers
  • методы: addServer(), removeServer(), resolveOnAll(), listServers(), getServerInfo()

Вариант 9. Файловые серверы

Базовый абстрактный класс FileServer:

  • закрытые поля: ip (string), os (string), diskCapacity (int), status (bool)
  • защищённые поля: serverName (string), protocol (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, mount(), unmount(), isMounted(), геттеры
  • чисто виртуальные методы: handleFile(const string& filename), getCapacity(), getProtocolName()

Производные классы:

  • FTPServer — дополнительно: maxUsers (int). Метод handleFile() выводит [FTP] Обработка файла: <filename>. Метод upload() — загрузка файла.
  • SMBServer — дополнительно: sharedFolders (int). Метод handleFile() выводит [SMB] Обработка файла: <filename>. Метод share() — предоставление общего доступа.
  • NASServer — дополнительно: raidLevel (int). Метод handleFile() выводит [NAS] Обработка файла: <filename>. Метод configureRAID() — настройка RAID.

Класс StorageManager:

  • закрытые поля: managerName, vector<FileServer*> servers
  • методы: addServer(), removeServer(), distributeFile(), listServers(), getServerInfo()

Вариант 10. Фаерволы

Базовый абстрактный класс Firewall:

  • закрытые поля: name (string), interface (string), status (bool), ruleCount (int)
  • защищённые поля: firewallType (string), vendor (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, enable(), disable(), isEnabled(), геттеры
  • чисто виртуальные методы: applyRule(const string& rule), getRules(), getTypeName()

Производные классы:

  • NetworkFirewall — дополнительно: zone (string). Метод applyRule() выводит [NetworkFW] Правило: <rule>. Метод addZoneRule() — добавление правила для зоны.
  • HostFirewall — дополнительно: processName (string). Метод applyRule() выводит [HostFW] Правило: <rule>. Метод allowProcess() — разрешение процесса.
  • CloudFirewall — дополнительно: region (string). Метод applyRule() выводит [CloudFW] Правило: <rule>. Метод addGeoRule() — добавление географического правила.

Класс SecurityManager:

  • закрытые поля: managerName, vector<Firewall*> firewalls
  • методы: addFirewall(), removeFirewall(), applyRuleToAll(), listFirewalls(), getFirewallInfo()

Вариант 11. Прокси-серверы

Базовый абстрактный класс ProxyServer:

  • закрытые поля: ip (string), port (int), proxyType (string), status (bool)
  • защищённые поля: serverName (string), protocol (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, start(), stop(), isRunning(), геттеры
  • чисто виртуальные методы: route(const string& request), getConfig(), getProxyTypeName()

Производные классы:

  • HTTPProxy — дополнительно: cacheSize (int). Метод route() выводит [HTTPProxy] Маршрутизация: <request>. Метод forward() — пересылка запроса.
  • SOCKSProxy — дополнительно: socksVersion (int). Метод route() выводит [SOCKS] Туннелирование: <request>. Метод tunnel() — создание туннеля.
  • ReverseProxy — дополнительно: targetServers (vector<string>). Метод route() выводит [ReverseProxy] Балансировка: <request>. Метод loadBalance() — распределение нагрузки.

Класс ProxyManager:

  • закрытые поля: managerName, vector<ProxyServer*> proxies
  • методы: addProxy(), removeProxy(), routeThroughAll(), listProxies(), getProxyInfo()

Вариант 12. Сетевые камеры

Базовый абстрактный класс NetworkCamera:

  • закрытые поля: ip (string), mac (string), resolution (string), status (bool)
  • защищённые поля: cameraName (string), cameraType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, powerOn(), powerOff(), isOnline(), геттеры
  • чисто виртуальные методы: capture(const string& mode), getStreamInfo(), getCameraTypeName()

Производные классы:

  • IPCamera — дополнительно: ptzSupported (bool). Метод capture() выводит [IPCamera] Захват: <mode>. Метод rotate() — поворот камеры.
  • WebCamera — дополнительно: fps (int). Метод capture() выводит [WebCam] Захват: <mode>. Метод captureFrame() — захват кадра.
  • ThermalCamera — дополнительно: tempRange (string). Метод capture() выводит [Thermal] Захват: <mode>. Метод detectHeat() — обнаружение тепловых аномалий.

Класс SurveillanceSystem:

  • закрытые поля: systemName, vector<NetworkCamera*> cameras
  • методы: addCamera(), removeCamera(), captureAll(), listCameras(), getCameraInfo()

Вариант 13. Балансировщики нагрузки

Базовый абстрактный класс LoadBalancer:

  • закрытые поля: ip (string), algorithm (string), status (bool), backendCount (int)
  • защищённые поля: lbName (string), lbType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, enable(), disable(), isEnabled(), геттеры
  • чисто виртуальные методы: distribute(const string& request), getStats(), getTypeName()

Производные классы:

  • RoundRobinLB — дополнительно: currentIndex (int). Метод distribute() выводит [RoundRobin] Распределение: <request>. Метод nextServer() — выбор следующего сервера.
  • LeastConnLB — дополнительно: currentLoad (int). Метод distribute() выводит [LeastConn] Распределение: <request>. Метод selectLeastLoaded() — выбор наименее загруженного.
  • HashLB — дополнительно: hashKey (string). Метод distribute() выводит [Hash] Распределение: <request>. Метод hashSelect() — выбор по хешу.

Класс LBManager:

  • закрытые поля: managerName, vector<LoadBalancer*> balancers
  • методы: addBalancer(), removeBalancer(), distributeToAll(), listBalancers(), getBalancerInfo()

Вариант 14. Сетевые хранилища

Базовый абстрактный класс NetworkStorage:

  • закрытые поля: ip (string), protocol (string), totalCapacity (int), status (bool)
  • защищённые поля: storageName (string), storageType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, connect(), disconnect(), isConnected(), геттеры
  • чисто виртуальные методы: allocate(const string& resource), getUsage(), getStorageTypeName()

Производные классы:

  • iSCSIStorage — дополнительно: lunCount (int). Метод allocate() выводит [iSCSI] Выделение: <resource>. Метод attachLUN() — подключение LUN.
  • NFSShare — дополнительно: exportCount (int). Метод allocate() выводит [NFS] Экспорт: <resource>. Метод exportDir() — экспорт каталога.
  • CIFSShare — дополнительно: domain (string). Метод allocate() выводит [CIFS] Монтирование: <resource>. Метод mountShare() — монтирование ресурса.

Класс StorageCluster:

  • закрытые поля: clusterName, vector<NetworkStorage*> storages
  • методы: addStorage(), removeStorage(), allocateOnAll(), listStorages(), getStorageInfo()

Вариант 15. Контейнеры Docker

Базовый абстрактный класс Container:

  • закрытые поля: name (string), image (string), status (bool), memoryMB (int)
  • защищённые поля: containerType (string), runtime (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, start(), stop(), isRunning(), геттеры
  • чисто виртуальные методы: run(const string& command), getLogs(), getContainerTypeName()

Производные классы:

  • WebContainer — дополнительно: exposedPort (int). Метод run() выводит [WebContainer] Выполнение: <command>. Метод deploy() — развёртывание веб-приложения.
  • DBContainer — дополнительно: storagePath (string). Метод run() выводит [DBContainer] Выполнение: <command>. Метод migrate() — выполнение миграции БД.
  • CacheContainer — дополнительно: maxEntries (int). Метод run() выводит [CacheContainer] Выполнение: <command>. Метод flush() — очистка кэша.

Класс Orchestrator:

  • закрытые поля: orchestratorName, vector<Container*> containers
  • методы: addContainer(), removeContainer(), runOnAll(), listContainers(), getContainerInfo()

Вариант 16. Сетевые сервисы

Базовый абстрактный класс NetworkService:

  • закрытые поля: name (string), port (int), protocol (string), status (bool)
  • защищённые поля: serviceName (string), serviceType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, launch(), terminate(), isRunning(), геттеры
  • чисто виртуальные методы: serve(const string& request), getMetrics(), getServiceTypeName()

Производные классы:

  • WebService — дополнительно: baseUrl (string). Метод serve() выводит [WebService] Запрос: <request>. Метод handleRequest() — обработка HTTP-запроса.
  • MailService — дополнительно: mailDomain (string). Метод serve() выводит [MailService] Запрос: <request>. Метод processEmail() — обработка письма.
  • DNSService — дополнительно: zoneName (string). Метод serve() выводит [DNSService] Запрос: <request>. Метод resolve() — разрешение DNS-имени.

Класс ServiceRegistry:

  • закрытые поля: registryName, vector<NetworkService*> services
  • методы: addService(), removeService(), serveOnAll(), listServices(), getServiceInfo()

Вариант 17. Сетевые адаптеры

Базовый абстрактный класс NetworkAdapter:

  • закрытые поля: name (string), mac (string), speedMbps (int), status (bool)
  • защищённые поля: adapterType (string), driver (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, enable(), disable(), isEnabled(), геттеры
  • чисто виртуальные методы: transmit(const string& packet), getSignalStrength(), getAdapterTypeName()

Производные классы:

  • EthernetAdapter — дополнительно: duplexMode (string). Метод transmit() выводит [Ethernet] Передача: <packet>. Метод setSpeed() — установка скорости.
  • WiFiAdapter — дополнительно: ssid (string), frequency (string). Метод transmit() выводит [WiFi] Передача: <packet>. Метод scanNetworks() — сканирование сетей.
  • CellularAdapter — дополнительно: operatorName (string), signalStrength (int). Метод transmit() выводит [Cellular] Передача: <packet>. Метод connectOperator() — подключение к оператору.

Класс NetworkManager:

  • закрытые поля: managerName, vector<NetworkAdapter*> adapters
  • методы: addAdapter(), removeAdapter(), transmitThroughAll(), listAdapters(), getAdapterInfo()

Вариант 18. Антивирусные шлюзы

Базовый абстрактный класс AVGateway:

  • закрытые поля: ip (string), version (string), status (bool), threatsBlocked (int)
  • защищённые поля: gatewayName (string), scanEngine (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, activate(), deactivate(), isActive(), геттеры
  • чисто виртуальные методы: scan(const string& target), getReport(), getGatewayTypeName()

Производные классы:

  • MailGateway — дополнительно: attachmentFilter (bool). Метод scan() выводит [MailGW] Сканирование: <target>. Метод scanAttachment() — сканирование вложения.
  • WebGateway — дополнительно: blockedCategories (vector<string>). Метод scan() выводит [WebGW] Сканирование: <target>. Метод blockCategory() — блокировка категории сайтов.
  • FileGateway — дополнительно: allowedFormats (vector<string>). Метод scan() выводит [FileGW] Сканирование: <target>. Метод scanFile() — сканирование файла.

Класс SecurityCenter:

  • закрытые поля: centerName, vector<AVGateway*> gateways
  • методы: addGateway(), removeGateway(), scanOnAll(), listGateways(), getGatewayInfo()

Вариант 19. Серверы видеоконференций

Базовый абстрактный класс ConfServer:

  • закрытые поля: ip (string), maxParticipants (int), status (bool)
  • защищённые поля: serverName (string), serverType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, boot(), shutdown(), isOnline(), геттеры
  • чисто виртуальные методы: hostSession(const string& sessionId), getSessionInfo(), getServerTypeName()

Производные классы:

  • VideoServer — дополнительно: resolution (string). Метод hostSession() выводит [VideoServer] Сессия: <sessionId>. Метод startCall() — начало видеозвонка.
  • AudioServer — дополнительно: codec (string). Метод hostSession() выводит [AudioServer] Сессия: <sessionId>. Метод startAudio() — начало аудиосессии.
  • ScreenShareServer — дополнительно: captureFps (int). Метод hostSession() выводит [ScreenShare] Сессия: <sessionId>. Метод startShare() — начало демонстрации экрана.

Класс ConferenceManager:

  • закрытые поля: managerName, vector<ConfServer*> servers
  • методы: addServer(), removeServer(), hostOnAll(), listServers(), getServerInfo()

Вариант 20. Системы мониторинга

Базовый абстрактный класс MonitorNode:

  • закрытые поля: ip (string), nodeType (string), pollInterval (int), status (bool)
  • защищённые поля: nodeName (string), metricType (string)
  • открытые методы: конструктор с параметрами, виртуальный деструктор, startMonitoring(), stopMonitoring(), isMonitoring(), геттеры
  • чисто виртуальные методы: poll(const string& metric), getAlerts(), getNodeTypeName()

Производные классы:

  • CPUMonitor — дополнительно: thresholdPercent (int). Метод poll() выводит [CPU] Опрос: <metric>. Метод checkLoad() — проверка нагрузки ЦП.
  • MemoryMonitor — дополнительно: limitMB (int). Метод poll() выводит [Memory] Опрос: <metric>. Метод checkUsage() — проверка использования памяти.
  • DiskMonitor — дополнительно: thresholdPercent (int). Метод poll() выводит [Disk] Опрос: <metric>. Метод checkSpace() — проверка свободного места.

Класс MonitoringCenter:

  • закрытые поля: centerName, vector<MonitorNode*> nodes
  • методы: addNode(), removeNode(), pollAll(), listNodes(), getNodeInfo()

Порядок выполнения

  1. Создать проект C++ в Qt Creator (CMake).
  2. Определить абстрактный базовый класс NetworkClient с указанными полями и методами.
  3. Реализовать производные классы TcpClient, UdpClient, WebSocketClient, переопределив чисто виртуальные методы.
  4. Реализовать класс Server с управлением списком клиентов через указатели на базовый класс.
  5. В main() создать объекты и продемонстрировать все сценарии взаимодействия.
  6. Скомпилировать, запустить, сохранить скриншоты.

Контрольные вопросы

  1. Какие модификаторы доступа существуют в C++? Чем отличается private от protected?
  2. Что такое абстрактный класс и чисто виртуальная функция?
  3. Почему деструктор базового класса следует объявлять виртуальным?
  4. Чем отличается композиция от наследования? В каких случаях предпочтительнее каждое из них?
  5. Что такое порядок вызова конструкторов и деструкторов при создании объекта производного класса?
  6. Как в производном классе вызвать конструктор базового класса с параметрами?
  7. Почему класс Server хранит указатели NetworkClient* а не объекты NetworkClient?
  8. Какие преимущества даёт использование наследования при моделировании сетевых клиентов?

Содержание отчёта

  1. Тема, цель и задание лабораторной работы.
  2. Диаграмма классов (можно нарисовать от руки или в инструменте).
  3. Текст программы с комментариями.
  4. Скриншоты результата выполнения программы.
  5. Ответы на контрольные вопросы.
Наверх
Лаб. работа “Обзор базовых конструкций и основных элементов языка”
Лаб. работа “Типы исключительных ситуаций и процесс их обработки”