Skip to content

CLI-проект на C: событийная модель Master-Client Authority через relay-сервер. Использует ENet (UDP) и MsgPack. Сервер без логики, Master обрабатывает input и рассылает состояние. Проект для изучения сетевой архитектуры и синхронизации.

Notifications You must be signed in to change notification settings

intfloatbool/event-driven-master-client-relay-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Event-Driven Master-Client Relay (CLI, C)

ENGLISH Version

Небольшой учебный сетевой CLI-проект на чистом C, демонстрирующий event-driven модель взаимодействия клиентов через сервер-ретранслятор с Master-Client Authority.

Проект создавался как практическое упражнение по:

  • сетевому программированию на C,
  • работе с ENet (UDP + надежная доставка),
  • сериализации и десериализации сообщений через MsgPack,
  • потокам и синхронизации,
  • проектированию архитектуры клиент ↔ сервер без real-time цикла.

🎯 Идея проекта

  • Есть сервер-ретранслятор (relay), который не содержит игровой логики
  • Первый подключившийся клиент становится Master
  • Master:
    • хранит состояние мира
    • обрабатывает input от других клиентов
    • рассылает обновлённое состояние всем
  • Остальные клиенты (Slaves):
    • отправляют только свои input-команды
    • применяют состояние, полученное от Master

Модель не real-time, а событийная:

  • обновление мира происходит по команде tick
  • идеально подходит для обучения, отладки и понимания сетевых паттернов

Ключевые принципы:

  • сервер не интерпретирует данные
  • сервер лишь ретранслирует сообщения
  • вся логика сосредоточена в Master-клиенте
  • единый протокол сообщений для клиента и сервера

📂 Структура проекта


.
├── Makefile
├── README.md
└── src
    ├── client.c              # CLI клиент (Master / Slave)
    ├── server.c              # Relay-сервер
    ├── protocol_msg.h        # Общий сетевой протокол
    ├── help_func/            # Вспомогательные функции
    └── thread_safe/          # Потокобезопасные структуры


🔌 Используемые технологии

  • C (C17)
  • ENet — UDP-библиотека с надежной доставкой
  • MsgPack-C — бинарная сериализация сообщений
  • POSIX Threads (pthreads) — многопоточность
  • Linux / WSL2

Проект ориентирован на Unix-подобные системы.


📡 Протокол сообщений

Все сообщения описаны в protocol_msg.h.

Примеры типов сообщений:

  • регистрация клиента
  • назначение Master
  • input клиента (намерение изменить состояние)
  • snapshot состояния мира

Сериализация выполняется через MsgPack, что:

  • избавляет от ручного фрейминга
  • делает протокол расширяемым
  • позволяет использовать одинаковые структуры на клиенте и сервере

🧵 Потоки и синхронизация

  • Сетевой цикл ENet работает в отдельном потоке
  • CLI-ввод работает независимо
  • Обмен между потоками реализован через потокобезопасные очереди
  • Исключены race-condition при работе с ENet

▶️ Сборка

Зависимости

Установить:

sudo apt install libenet-dev libmsgpack-dev

Сборка

make

Будут собраны:

  • server
  • client

🚀 Запуск

Сервер

./server

Клиенты

./client <IP_сервера> 7777

Можно запускать:

  • несколько клиентов на одной машине
  • клиентов на разных ПК в одной LAN / Wi-Fi сети

🕹️ Управление (CLI)

Примеры команд в клиенте:

tick
x+
x-
y+
y-
  • tick — инициирует обновление мира (Master)
  • остальные команды отправляют input Master-клиенту

📚 Для чего этот проект

Проект создавался не как игра, а как:

  • учебный стенд по сетевому программированию

  • основа для перехода к:

    • real-time синхронизации
    • prediction / reconciliation
    • авторитарному серверу
  • материал для статей и образовательных проектов


About

CLI-проект на C: событийная модель Master-Client Authority через relay-сервер. Использует ENet (UDP) и MsgPack. Сервер без логики, Master обрабатывает input и рассылает состояние. Проект для изучения сетевой архитектуры и синхронизации.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published