В этом билете необходимо будет использовать динамический полиморфизм для организации широковещательных сообщений.
В этом репозитории находится незавершенный исходный код проекта Multicast*). Этот проект предназначен для того, чтобы в интерактивном режиме передавать сообщения на несколько адресов UDP и несколько устройств с последовательным интерфейсом.
*) Строго говоря, multicast - это способ передачи информации, в котором отправляется один экземпляр сообщения для нескольких клиентов. Проект же отправляет несколько unicast-сообщений каждому клиенту. В случае этого экзаменационного билета название выбрано условно, потому что не нашлось ничего лучше.
Программа multicast в качестве единственного аргумента
командной строки принимает путь до конфигурационного файла,
в котором описаны клиенты-приемники широковещательных
сообщений.
Пример конфигурационного файла:
udp 127.0.0.1 9000
udp 127.0.0.1 9001
udp 127.0.0.1 9002
serial /dev/pts/0
serial /dev/pts/2
В нем описано 3 UDP клиента и 2 клиента с последовательным интерфейсом.
Программа после запуска:
- Валидирует аргументы командной строки.
- Читает и валидирует конфигурацию.
- Входит в бесконечный цикл, в котором принимает строки
из
stdinи переслывает ее всем клиентам.
- Проект не кроссплатформенный, соберется только под POSIX-совместимую операционную систему.
Для сборки проекта выполните:
cmake -B build/
cmake --build build/Вручную проект можно протестировать в терминале.
Потребуется утилиты socat, nc и cat.
Для каждого клиента из конфигурационного файла запустите утилиту
nc в режиме слушающего UDP сокета.
Например, для
udp 127.0.0.1 9000
клиент настраивается так:
nc -ul 127.0.0.1 9000Для каждого клиента потребуется создать петлю с использованием
двух /dev/pts/* устройств.
В одно из устройств будет писать программа multicast,
из другого устройства будет читать терминал при помощи cat.
Петля создает при помощи утилиты socat.
Для каждого клиента в конфигурации создайте петлю:
socat -d -d pty,raw,echo=0 pty,raw,echo=0
2026/01/19 18:17:37 socat[269419] N PTY is /dev/pts/0
2026/01/19 18:17:37 socat[269419] N PTY is /dev/pts/5
2026/01/19 18:17:37 socat[269419] N starting data transfer loop with FDs [6,6] and [8,8]В выводе socat видно, что было создано два устройства,
/dev/pts/0 и /dev/pts/5.
В конфигурационный файл записываем /dev/pts/0,
а читать будем /dev/pts/5.
Для чтения в новом окне терминала (программу socat нельзя прерывать)
выполните:
cat < /dev/pts/5После того, как все клиенты настроены, запустите приложение:
./build/multicast ./config.cfg
Enter message:и начните вводить сообщения.
Вы должны увидеть их в каждом окне терминала, где
запущен nc или cat.
Что уже реализовано:
- разбор аргументов командной строки;
- система сборки;
- чтение и валидация конфигурации;
- чтение ввода из
stdin; - функция отправки сообщения по UDP;
- функция отправки сообщений по последовательному интерфейсу.
Что нужно реализовать: Используя динамеческий полиморфизм, придумайте как создать и единообразно обслуживать клиентов с разным типом (UDP и последовательный интерфейс).
Места, где в коде нужно внести изменения, помечены комментариями TODO:
// TODO: отправьте всем клиентамПо желанию можно написать юнит-тесты.