Asio的Buffer应该如何使用

给你一囗甜甜゛ 提交于 2020-02-28 21:18:13

Asio的Buffer应该如何使用

什么是asio::buffer

asio::buffer并不是真正的缓冲区,想要获得缓冲区必须传入一段内存,比如st::vector<>,char[],std::string等。而asio::buffer负责管理这段内存,特别注意对于异步API内存在使用时必须有效。

asio::const_buffer和asio::mutable_buffer

  1. 构造函数不同
  2. const_buffer不可修改,初始化是什么使用socket发送时就会发送什么,比如使用st::vector初始化,虽然vector的内容可以修改,但是对asio::buffer来说不起作用

asio::buffer使用方法

  1. 简单的方法就是在session类里申请一片内存(或全局内存),发送时使用asio::buffer包装
  2. BufferSequence
  3. 使用内存池

例子

  1. 在session类里申请一片内存

    class session
        : public std::enable_shared_from_this<session> {
        public:
            session(tcp::socket socket): socket_(std::move(socket)) {}
            ~session() {}
    
            void start() {
                for (int i = 0; i < 100; ++i) {
                    do_write();
                }
            }
    
        private:
            void do_write() {
                auto str = std::to_string(num);
                for (int i = 0; i < str.size(); ++i) {
                    data[i] = str[i];
                }
                data[str.size()] = '\n';
                num++;
    			//保证调用异步方法时session仍然存在
                auto self(shared_from_this());
                //使用boost::asio::buffer包装并发送
                boost::asio::async_write(socket_, boost::asio::buffer(data),
                [self](boost::system::error_code /*ec*/, std::size_t /*length*/) {
                });
            }
    
            // The socket used to communicate with the client.
            tcp::socket socket_;
            //固定大小缓冲区
            char data[128];
            int num = 0;
    };
    
  2. BufferSequence

    class shared_const_buffer
    {
    

public:
// Construct from a std::string.
explicit shared_const_buffer(const std::string& data)
: data_(new std::vector(data.begin(), data.end())),
buffer_(boost::asio::buffer(*data_))
{
}

   // Implement the ConstBufferSequence requirements.
   typedef boost::asio::const_buffer value_type;
   typedef const boost::asio::const_buffer* const_iterator;
   const boost::asio::const_buffer* begin() const { return &buffer_; }
   const boost::asio::const_buffer* end() const { return &buffer_ + 1; }

private:
boost::shared_ptr<std::vector > data_;
//这里可以使用boost::asio::const_buffer数组
//可以使用初始化列表初始化
boost::asio::const_buffer buffer_;
};

class session
public std::enable_shared_from_this
{
public:
session(tcp::socket socket): socket_(std::move(socket))
{
}
 void start()
 {
   do_write();
 }

private:
void do_write()
{
std::time_t now = std::time(0);
//初始化后不能更改,缺点就是对于变化的信息每次都要重新构造buffer
shared_const_buffer buffer(std::ctime(&now));

   auto self(shared_from_this());
   boost::asio::async_write(socket_, buffer,
       [self](boost::system::error_code /*ec*/, std::size_t /*length*/)
       {
       });
 }

 // The socket used to communicate with the client.
 tcp::socket socket_;

};


3. 内存池

内存池技术比较复杂了,也有不少开源实现,这里就不详述了
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!