-
Необходимо перейти в корневую директорию и выполнить команду для сборки проекта
make
-
Исполняемые файлы появятся в папке
bin
-
Для удаления всех объектных и исполняемых файлов необходимо выполнить команду
make clean
Задание 1. Реализовать 2 программы, первая сервер, вторая клиент. Сервер создает сегмент разделяемой памяти (достаточный для хранения сообщений) и записывает сообщение виде строки Hi!
, ждет ответа от клиента и выводит на экран, удаляет сегмент разделяемой памяти. Клиент подключается к сегменту разделяемой памяти и считывает сообщение от сервера, выводит на экран, отвечает серверу сообщением виде строки Hello!
. Сделать это как для POSIX, так и для SYSTEM V стандартов.
Убедимся, что программа работает, запустив сервер, а затем клиента:
Note
Результат работы для POSIX и SYSTEM V стандартов будет одинаковый.
Задание 2. Написать 2 программы: первая сервер, вторая клиент. Сервер создает сегмент разделяемой памяти для реализации чата с общей комнатой и его задача уведомлять клиентов о появлении новых участников, о новых сообщениях. Клиент подключается к сегменту разделяемой памяти, созданному сервером, сообщает ему свое имя и получает в ответ все сообщения в комнате. Далее может отправлять сообщения в общий чат. Получение служебных сообщений от сервера (имена новых клиентов, сообщения от других пользователей) и отправка сообщений в чат лучше реализовать в разных потоках. Интерфейс клиента реализуем с помощью библиотеки ncurses.
Запуск
- Запуск сервера:
./t2server
- Запуск клиента
./t2client <имя_клиента>
Управление
Tab
- переключение активного окна (сообщений / пользователей);↑
- прокрутить список активного окна вверх;↓
- прокрутить список активного окна вниз;Ctrl+C
- выход из программы.
Описание работы
Сервер:
- Создает сегмент разделяемой памяти для хранения данных о клиентах и сообщениях;
- Создает семафор для синхронизации доступа к разделяемой памяти;
- Ожидает подключения клиентов, постоянно проверяя и обновляя данные в памяти;
- Обрабатывает сигнал
Ctrl+C
для корректного завершения работы: отсоединяется от разделяемой памяти и удаляет ее, а также удаляет семафор.
Клиент:
- Подключается к сегменту разделяемой памяти и семафору, созданному сервером;
- Записывет информацию о себе в разделеяемой памяти;
- Получает и отображает список текущих пользователей и сообщения из чата;
- Проверяет обновления в разделяемой памяти и слушает ввод пользователя в разных потоках;
- Обрабатывает сигнал
Ctrl+C
для корректного завершения работы: удаляет свое имя из списка пользователей, отсоединяется от разделяемой памяти и завершает работу ncurses.
Демонстрация работы
-
Запустим сервер, а затем
клиента_1
.Клиент_1
пишет сообщение в чат. Затем запускаетсяклиент_2
. Он получает информацию об уже написанных сообщениях и именах всех клиентов, подключенных к чату (этоклиент_1
иклиент_2
).Клиенту_1
тем временем приходит информация о подключенииклиента_2
:Сервер тем временем логирует всю информацию.
-
Оба клиента обмениваются в чате приветственными сообщениями:
-
Клиент_1
отключается от сервера. Уклиента_2
обновляется информация о подключенных пользователях. Отключаетсяклиент_1
, вручную завершается работа сервера: