避免Boost :: Asio :: Buffer和General Buffer Confusion的复制

时间:2014-10-19 19:29:02

标签: c++ sockets networking boost-asio

以下是来自http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/?pg=10的boost :: asio教程的Connection类的摘录。

class Connection : public boost::enable_shared_from_this< Connection >
{
    friend class Acceptor;
    friend class Hive;

private:
    boost::shared_ptr< Hive > m_hive;
    boost::asio::ip::tcp::socket m_socket;
    boost::asio::strand m_io_strand;
    boost::asio::deadline_timer m_timer;
    boost::posix_time::ptime m_last_time;
    std::vector< uint8_t > m_recv_buffer;
    std::list< int32_t > m_pending_recvs;**
    std::list< std::vector< uint8_t > > m_pending_sends;
    int32_t m_receive_buffer_size;
    int32_t m_timer_interval;
    volatile uint32_t m_error_state;

要将数据写入此tcp套接字,请将向量传递并复制到pending_sends成员列表。稍后,使用vector作为参数创建boost :: asio :: buffer。

我想编辑这个类,以便能够将1个缓冲区的内容写入多个连接,而无需为每个套接字复制底层内存。以下步骤是否合理?

  • 首先创建一个shared_ptr到某种数据结构,可以作为缓冲区的基础(std :: streambuf,std :: string,std :: vector)

  • 将shared_ptr复制到我要将其内容写入的每个连接类。

  • 使用shared_ptr

  • 创建一个boost :: asio :: buffer对象
  • 调用socket.async_write

特别是,我对缓冲区/流的概念非常朦胧。我不知道为什么我应该从1种类型的对象而不是另一种对象创建一个boost :: asio :: buffer。有没有特别的理由为什么这段代码的作者选择了`std :: vector?如果我通过调用写入ostream的序列化函数来获取数据,那么最好使用std :: streambuf吗?我很感激任何有助于清理缓冲区概念的资源。

0 个答案:

没有答案