Неблокированный вызов против select () в сокете - PullRequest
1 голос
/ 18 сентября 2010

Мне нужно реализовать игровой сервер на C, который обрабатывает несколько клиентов и постоянно обменивается с ними информацией.Клиент может отправлять информацию не всегда. Должен ли я назначить поток с неблокирующим сокетом или использовать вызов select ().

Какой из них лучше?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2010

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

С помощью select () вы можете просматривать все сокеты одновременно (независимо от того, блокируют они или нет, кстати) и должны обрабатывать только те из них, которые активны.

Если вы работаете в Linux и у вас есть много сокетов для просмотра, вы можете взглянуть на epoll ()

0 голосов
/ 18 сентября 2010

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

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

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

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