Asio的Buffer应该如何使用
什么是asio::buffer
asio::buffer并不是真正的缓冲区,想要获得缓冲区必须传入一段内存,比如st::vector<>,char[],std::string等。而asio::buffer负责管理这段内存,特别注意对于异步API内存在使用时必须有效。
asio::const_buffer和asio::mutable_buffer
- 构造函数不同
- const_buffer不可修改,初始化是什么使用socket发送时就会发送什么,比如使用st::vector初始化,虽然vector的内容可以修改,但是对asio::buffer来说不起作用
asio::buffer使用方法
- 简单的方法就是在session类里申请一片内存(或全局内存),发送时使用asio::buffer包装
- BufferSequence
- 使用内存池
例子
-
在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; };
-
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. 内存池
内存池技术比较复杂了,也有不少开源实现,这里就不详述了
来源:CSDN
作者:vitaminYZZ
链接:https://blog.csdn.net/weixin_44048823/article/details/104563147