управление 1000+ соединением с помощью boost в клиенте

Здесь я работаю на симуляторе шлюза. Целью шлюза является подключение к центру обработки данных и потоковое видео в центр обработки данных, если центр обработки данных запросит это.

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

В С++ для этой цели можно использовать select, демультиплексировать соединение с центром обработки данных. Поскольку здесь мне, возможно, придется создать 1000 соединений, select не подходит.

Я понял, как управлять несколькими клиентами на сервере, используя метод acceptor.async, и обработчик примет его.

Но поскольку шлюз является клиентским приложением

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

Шлюз будет работать на обоих окнах Linux.


person Chris_vr    schedule 25.03.2011    source источник


Ответы (3)


Если бы мне нужно было решить эту проблему, я бы сначала попробовал libevent. Libevent автоматически выбирает «наилучший доступный» механизм для каждой платформы, будь то epoll, kqueue или select, и позволяет вам сосредоточиться на том, что уникально для вашей программы.

person sarnold    schedule 25.03.2011
comment
@chris_vr, угадай еще раз :) Libevent должен компилироваться в Linux, *BSD, Mac OS X, Solaris и Windows. По общему признанию, последняя запись журнала изменений, в которой конкретно упоминаются окна, немного устарела, но рекламируется, что она работает. - person sarnold; 25.03.2011
comment
Да, правильно, libevent работает и в Windows. Разве мы не можем реализовать epoll с помощью boost. Проблема? Я не знаю о libevent lib. - person Chris_vr; 25.03.2011

  • Окна: WSAEventSelect
  • Линукс: epoll
  • FreeBSD: kqueue
person Erik    schedule 25.03.2011
comment
плз. Расскажите мне шаги, используя boost. Как я могу демультиплексировать 1000-е соединение, если клиентское 100-е соединение с тем же сервером (центром обработки данных). - person Chris_vr; 25.03.2011
comment
Кажется, что и для Linux, и для Windows мне нужно использовать другую стратегию для этой ситуации. Я прав? - person Chris_vr; 25.03.2011
comment
@Chris_vr: Ни в Linux, ни в Windows нет проблем с обработкой 1000 подключений, если вы используете более эффективные способы управления сокетами. Я не знаю, какой механизм уведомления о сокетах использует boost::asio, но три механизма, которые я упомянул, не должны иметь проблем с обработкой 1000 подключений при правильном использовании. - person Erik; 25.03.2011

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

В Windows, по крайней мере, WSAWaitForMultipleEvents — это ваш ответ. http://msdn.microsoft.com/en-us/library/ms742219(v=vs.85).aspx

person Chris K    schedule 25.03.2011
comment
Кажется, что и для Linux, и для Windows мне нужно использовать другую стратегию для этой ситуации. Я прав? - person Chris_vr; 25.03.2011
comment
Перекрывающийся ввод-вывод, безусловно, лучший способ повысить производительность, но вы можете использовать WSAWaitForMultipleEvents — вы можете отправить несколько рабочих потоков для обработки активных соединений. - person Chris K; 25.03.2011