Сокеты C ++ - неблокирующий или выборочный подход - PullRequest
0 голосов
/ 07 февраля 2012

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

Я буду говорить о мульти-клиентском сервере, который имеет дело с клиентами, подключающимися через TCP к порту, привязанному к серверу.

Я помню, как кодировал это с помощью select (), FD_ISSET, FD_ZERO, FD_SET - и это семейные методы для приема и управления списком подключенных клиентов на моем сервере - и я помню, что это работало замечательно, но на этот разречь идет о простой RPG-игре для 32 игроков - так что ничего быстрого не происходит, поэтому TCP здесь.

Простые пакеты GO_TO, изменение ПОГОДЫ, обновления ВРЕМЕНИ, сообщения ТЕКСТА, ИЗМЕНЕНИЯ СОСТОЯНИЯ И ВЫХОДА ИЗ ПУНКТА, ВХОДЫ (трансляции)и что-то еще, что я не могу сейчас выяснить.

Что мешает мне сегодня спать, так это то, что я действительно должен выбрать, чтобы этот сервер работал бесперебойно (если говорить о его производительности сети).

Люди часто говорят о «неблокирующем» подходе к сокетам, используя ioctlsocket (..) или некоторые другие «многопоточные» чудеса, которые делают это, но вы должны управлять ими в другом стиле - и да, у меня естьпопробовал это, и видел много подходов - которые имеют дело со многими потоками вокруг в приложении - что является своего родадействительно сложно ...

Я видел и те "асинхронные" сокеты MSDN, где вы получаете сообщения из сокета - но это слишком много, я думаю.

Так что вместо кодирования яподумав и спросив,

  • , если select () может добиться цели, говоря об игровом сервере, обрабатывая, скажем, этих 32 игроков одновременно.Я имею в виду, что, как вы думаете из своего опыта, это поможет?Или мне пришлось бы откатиться в конце и изменить весь код сервера при приближении к крайнему сроку ..

  • В чем именно разница между выбором / ioctlsocket?

  • Каковы плюсы и минусы для обоих методов?

Большое спасибо за любой ответ на этот вопрос, я надеюсь, что я понимаю, о чем я спрашиваю.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

сервер в стиле выбора может легко обрабатывать такое небольшое количество одновременных клиентов, даже на скромном оборудовании.

Помните о удобочитаемости и выберите самое простое решение, исходя из вашего опыта. Если вы делали похожую реализацию с select в прошлом, тогда не беспокойтесь о производительности.

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

1 голос
/ 07 февраля 2012

Если вы действительно серьезно относитесь к выполнению каких-либо более сложных задач по работе с сетями в C ++, вам определенно следует рассмотреть возможность использования boost :: asio , в этом нет ничего «слишком сложного», если вы понимаете, что это философии. А поддержка 32 игроков в конечном итоге приведет вас в тиски многопоточности, так почему бы не начать сегодня?

Также важным является вопрос обработки неработающих подключений, невосприимчивых клиентов и любых обновлений состояния игры, пока игра ожидает сетевого ввода. Как вы планируете решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...