В настоящее время я разрабатываю «онлайн» настольную игру на C с сокетами AF_INET.
Он состоит из сервера, который является «рефери» игры, и клиента на игрока.
Единственная задача клиента - отправлять на сервер позицию места на доске, выбранного игроком (игра), и только сервер должен обрабатывать игру каждого игрока. Сервер всегда транслирует изменения на доске каждому игроку.
Главное, с чем я борюсь - это общение. У меня есть 2 варианта:
Реализация потоковых сокетов и создание на сервере потока (и сокета) для обработки каждого клиента.
Внедрите только сокет датаграммы на сервере и создайте поток для обработки каждого полученного воспроизведения, идентифицируя игрока по его IP.
Со вторым вариантом у меня должна быть некоторая структура данных для хранения данных каждого игрока (вероятно, хеш-таблицы для обеспечения быстрого доступа), таких как его счет, и в каждой полученной игре
Мне нужно обновить данные соответствующего игрока. В то время как в первом варианте локальные переменные стека потока могут содержать эту информацию.
Кроме того, в первом варианте мне пришлось бы иметь (без необходимости) много потоков, даже если recvfrom - это функция с пассивным ожиданием, ядру пришлось бы тратить время на управление всеми сообщениями и перенаправлять их на правильное гнездо верно?
В целом, я хочу реализовать наиболее эффективную стратегию взаимодействия клиент-сервер, даже если мне потребуется больше времени для ее реализации.
Какой самый эффективный вариант?