boost::asio расширение TCP сокет

Я пытаюсь сделать расширение asio, похожее на сокет boost, с реализацией как для windows, так и для linux. Расширения будут использоваться для взаимодействия с сетью KNX с использованием EIBD для Linux. Вопрос в том, как отслеживать несколько файловых дескрипторов. Если вы используете select(), как обойти ограничение FD_SETSIZE?

Как boost справляется с этим в реализации сокетов? Насколько мне известно, в Windows используется порты завершения ввода-вывода.

1 ответ

Решение

Краткий ответ на мой вопрос - использование epoll. Согласно википедии, epoll - это масштабируемый механизм уведомления о событиях ввода / вывода для Linux, впервые представленный в ядре Linux 2.5.44.

select(2) может отслеживать до FD_SETSIZE количества дескрипторов за раз, обычно небольшое количество, определяемое во время компиляции libc. Вместо этого epoll не имеет таких фиксированных ограничений и не выполняет линейное сканирование. Следовательно, он способен работать лучше и обрабатывать большее количество событий.

Чтобы узнать, как использовать epoll, зайдите на banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/.

Что касается Boost, на многих платформах Boost.Asio реализует шаблон проектирования Proactor в терминах Reactor, таких как select(ядро 2.4), epoll(ядро 2.6) или kqueue(Mac OS).

В Windows NT, 2000 и XP Boost.Asio использует перекрывающиеся операции ввода-вывода для обеспечения эффективной реализации шаблона проектирования Proactor.

Больше на Boost:

www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview/core/async.html

www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/design/implementation.html

Другие вопросы по тегам