TCP-сервер с информацией о состоянии с использованием сетевой библиотеки - PullRequest
1 голос
/ 12 февраля 2011

Я пишу tcp-сервер для пошаговой онлайн-игры. Я уже написал прототип с использованием php сокетов, но хотел бы перейти на C ++. Я просматривал популярные сетевые библиотеки (ASIO, ACE, POCO, LibEvent), но в настоящее время неясно, какая из них лучше всего подойдет моим потребностям:

1) Соединения постоянны (порядка минут), и сервер должен иметь возможность обрабатывать более 100 одновременных подключений.

2) Соединения должны поддерживать информацию о состоянии (данные для входа пользователя). [мой php-прототип в настоящее время требует, чтобы каждый клиентский запрос содержал информацию для входа в систему]

3) По выбору и предпочтительно многопоточный, но единый процесс. Предпочитают не иметь 1 поток на соединение, а фиксированное количество потоков, работающих на всех открытых соединениях.


Я склоняюсь к платформам POCO TCPServer или Reactor, но не совсем уверен, соответствуют ли они моим требованиям. Я думаю, что Reactor является однопоточным, а TCPServer обеспечивает потоковое соединение 1: 1. Я прав?


В любом случае, я не совсем уверен, как выполнить самую важную задачу - связать информацию для входа в конкретное соединение с соединениями, которые приходят и уходят случайным образом.

Ответы [ 2 ]

5 голосов
/ 12 февраля 2011

Boost.Asio должен соответствовать вашим требованиям. Очередь реактора может обслуживаться несколькими потоками . Использование асинхронных методов позволит вам создать фиксированное число потоков, обслуживающих все соединения.

Учебники и Примеры , пожалуй, лучшее место для начала, если вы не знакомы с библиотекой.

0 голосов
/ 12 февраля 2011

Вы также можете взглянуть на MUSCLE , многопользовательскую сетевую библиотеку и сервер, которые я написал для такого рода приложений.Он лицензирован BSD, обслуживает сотни пользователей и включает в себя механизм базы данных на стороне сервера для хранения и обмена любой информацией, которую вы хотите, чтобы клиенты знали друг о друге.По умолчанию сервер является однопоточным, но я не обнаружил, что это является проблемой на практике (и возможно расширить сервер до многопоточного, если это окажется необходимым).

...