TCP-сервер с информацией о состоянии с использованием сетевой библиотеки

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

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

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

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


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


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


person Justin    schedule 12.02.2011    source источник


Ответы (2)


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

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

person Sam Miller    schedule 12.02.2011

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

person Jeremy Friesner    schedule 12.02.2011