Повышение ASIO и сокрытие этих хитрых объектов io_service - PullRequest
1 голос
/ 20 июля 2011

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

В нем есть две нити.Один из них для io_service-> run () для ожидания входящих пакетов UDP.Другой для отправки трансляций.

Я следовал примеру здесь: http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/echo/async_udp_echo_server.cpp

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

Я еще не прочитал всю документацию io_service, но так ли этоможно иметь частную версию io_service в экземпляре объекта?Конструктор Socket делает жизнь невероятно трудной для этого.

Как бы вы изменили пример, чтобы скрыть вещи внутри потока?

Я также огромный нуб C ++: P

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Хорошо! Кто-то, с кем я работаю, унаследовал эту ужасную библиотеку и выяснил мою проблему ...

Сокрытие io_service внутри класса абсолютно возможно, НО! Вы должны иметь объект io_service, определенный перед объектом сокета. Неважно, в каком порядке вы указываете суб-конструкторы.

Пример:

  Works:
  boost::asio::io_service io_service;
  udp::socket socket_;
  udp::endpoint sender_endpoint_;
  enum { max_length = 1024 };
  char data_[max_length];

  doesn't work:
  udp::socket socket_;
  boost::asio::io_service io_service;
  udp::endpoint sender_endpoint_;
  enum { max_length = 1024 };
  char data_[max_length];

Итак, вот что вызвало мою проблему.

0 голосов
/ 20 июля 2011

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

...