обрабатывать клиентский буфер на tcp-сервере

Поскольку я прочитал много текста и кода о программировании сокетов, я решил пойти следующим образом:

TCP-сервер:

  • Мультиплексирование сокетов
  • асинхронный ввод-вывод

Я хочу иметь возможность обрабатывать 800-1200 клиентских подключений одновременно. Как мне обрабатывать клиентские буферы? Каждый пример, который я читал, работал только с одним единственным буфером. Почему люди не используют что-то вроде:

typedef struct my_socket_tag {
    socket sock;
    char* buffer;
} client_data;

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

Это обычная практика? Я упускаю суть?

Пожалуйста, дайте несколько советов, как улучшить мой вопрос в следующий раз, спасибо!


person stackofervlow    schedule 27.12.2012    source источник
comment
Нечего сказать, пример в какой-то момент неверен, дизайн проще, потому что это пример... Использование структуры, выделенной из кучи или полученной из статического массива (фиксированный размер, который равен количеству максимальных соединений) является хорошая идея   -  person benjarobin    schedule 27.12.2012


Ответы (1)


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

Существуют различные виды серверных приложений; нет единого подхода, который идеально подходил бы для всех задач. Необходимо учитывать множество деталей (является ли это услуга, ориентированная на потоки или дейтаграммы? Являются ли соединения, если таковые имеются, постоянными? Включает ли она множество небольших передач данных, или несколько больших передач, или много больших передач? И т.д. и так далее). Вот почему вы вряд ли встретите какие-либо распространенные примеры в книгах.

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

Сказав это, я бы порекомендовал изучить C++ и повысить asio (или аналогичный фреймворк). Он решает многие проблемы, связанные с масштабируемостью, поэтому нет смысла изобретать велосипед.

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

person Roman Dmitrienko    schedule 27.12.2012
comment
Во первых спасибо за ссылку на книгу. Я еще не слышал об этом. - person stackofervlow; 28.12.2012