Boost的ASIO并隐藏那些棘手的io_service对象

时间:2011-07-19 20:17:28

标签: c++ boost-asio encapsulation

所以,我有这门课。它应该是一个单身人士,但没有理由你不能做更多。

其中有两个主题。 一个是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 个答案:

答案 0 :(得分:2)

好!我工作的人继承了这个可怕的图书馆并找出了我的问题......

在课堂上隐藏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];

所以,这就是造成我问题的原因。

答案 1 :(得分:0)

您可以隐藏io_service,但这没有多大意义。如果您决定使用异步模型,那么您必须一直使用它。因此,您的应用程序应该围绕io_service构建。也就是说,如果你将io_service隐藏在包裹套接字的类中,那么谁将在run ()上调用io_service?更复杂的是,你需要为每个套接字类别抛出一个额外的线程。一个可能实际适用于那种设计的一个可能的解决方案是让你的库中的每个套接字类都有一些隐藏的单例io_service访问,但随后您限制用户跨多个线程进行扩展。至于构造函数以及很难获得正确的顺序,请查看base from this idiom,它旨在解决此类问题。