Сервер данных программирования сокетов - PullRequest
2 голосов
/ 03 ноября 2010

Я пишу код на C ++ для сервера данных в Linux. У меня есть список сокетов в виде файловых дескрипторов для всех абонентских подключений. Моему серверу нужно постоянно отправлять данные подписчику. У меня максимум 100-200 подписчиков. Какой самый быстрый способ передать данные всем подписчикам одновременно? Мне нужны данные, чтобы связаться с подписчиком как можно скорее. Я думаю о некоторых асинхронных методах, но не уверен, как мне это реализовать. Стоит ли просто вызывать системный асинхронный метод? Или я должен создать несколько потоков для обработки каждого подписчика? Или я должен реализовать какой-то пул потоков?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 03 ноября 2010

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

Для записи boost :: asio - это хороший, переносимый способ выполнения асинхронных коммуникаций в C ++.

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

2 голосов
/ 03 ноября 2010

Я не очень хорошо знаю Linux, но не использует один поток на соединение. Используйте любой асинхронный метод, который позволяет обрабатывать результаты чтения / записи управляемым событиями (обратным вызовом) способом, если таковой существует.

0 голосов
/ 12 декабря 2010

проверка

epoll
для мультиплексирования.Это намного сложнее, чем select, и в нем было рассмотрено много недостатков select.
0 голосов
/ 03 ноября 2010

«Расширенное программирование в среде Unix» У. Ричарда Стивенса (классическая книга) описывает способы выполнения расширенного ввода-вывода с мультиплексированием между несколькими файловыми дескрипторами (раздел 12.5.1 на стр. 396). Да, у меня есть книга передо мной. :)

Я думаю, что есть 2 способа сделать это:

  1. выделение пула потоков и делегирование n файловых дескрипторов для обработки каждым потоком.
  2. сделать все это в одном процессе, используя асинхронный ввод-вывод с использованием системных вызовов select и poll.

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

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