boost::asio学习之[七] buffer
来源:互联网 发布:知到 西方文明史导论 编辑:程序博客网 时间:2024/06/05 12:01
boost::asio buffer很实用,就找了一点资料学习之。
boost::asio学习 - buffer
boost::asio::streambuf
使用read_until()
和 async_read_until()
读取line-based(使用"\r\n"或者其它自定义字符序列作为delimiter)数据时需要boost::asio::streambuf来缓存读取到的数据。
下面是boost文档中的read_unitl()示例:
boost::asio::streambuf sb;
...
std::size_t n = boost::asio::read_until(sock, sb, '\n');
boost::asio::streambuf::const_buffers_type bufs = sb.data();
std::string line(
boost::asio::buffers_begin(bufs),
boost::asio::buffers_begin(bufs) + n);
delimiters可以为a single char
, a std::string
or a boost::regex
,而且还可以是自定义的函数或函数对象,示例参见 Line-Based Operations。
boost::asio::async_read_until() 示例: posix_chat_client,其它示例:http sync client
boost::asio::buffer
boost::asio::buffer()不会新分配存储空间,而是直接使用传入boost::array、std::vector、std::string、char[]等类型参数已分配的空间。boost::asio::buffer()返回值为const_buffer或mutable_buffer对象,和buffer对象相关的函数操作有:boost::asio::buffer_size(), boost::asio::buffer_cast()
socket.read_some() 示例
boost::asio::write() 示例
boost::asio::buffer_size 示例
ConstBufferSequence类型
一个自定义的ConstBufferSequence类型实现:shared_const_buffer
异步IO操作中自定义内存分配
asio在执行异步IO操作时会使用系统函数来动态分配内存,使用完后便立即释放掉;在IO操作密集的应用中,这种内存动态分配策略会较大地影响程序的整体性能。为了避免这个问题,可以在在应用程序中创建一个内存块供asio异步IO操作使用,异步IO操作通过自定义接口 asio_handler_allocate 和asio_handler_deallocate 来使用该内存块。
示例:custom_allocation_server
上述例子中使用到了 boost::aligned_storage<1024> storage_ 来管理原始内存。
boost::ip::tcp::iostream
将ip::tcp::iostream绑定到底层的socket上,通过iostream上的输入输出来进行IO操作:daytime_server 和 daytime_client
gather-write写操作
"gather-write"即将存放在多个内存块中的数据通过一次系统调用完成所有数据的写操作,相对于多次执行系统调用"gather-write"的IO性能显然更好。
buffers.push_back(boost::asio::buffer(outbound_header_));
buffers.push_back(boost::asio::buffer(outbound_data_));
boost::asio::async_write(socket_, buffers, handler);
完整示例:serialization connection
示例2:
boost::array<boost::asio::const_buffer, 2> buffers = {{ //此处使用2个大括号是为了编译器兼容
boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
boost::asio::buffer(eol) }};
boost::asio::async_write(output_, buffers,
boost::bind(&posix_chat_client::handle_write_output, this,
boost::asio::placeholders::error));
- boost::asio学习之[七] buffer
- Boost.Asio学习之Buffer
- 【boost学习】之boost::asio(4)——boost::asio::buffer用法
- boost::asio学习 - buffer篇
- boost::asio::buffer
- boost::asio::buffer
- boost-asio-buffer介绍
- boost::asio::buffer用法
- 一步一步学习 Boost 之 Asio
- boost::asio学习之[一]
- Boost.Asio学习之Tutorial
- Boost.Asio学习之Allocation
- Boost.Asio学习之总结
- boost::asio学习之[二]boost::asio::strand
- boost asio 学习总结之 io_service
- boost::asio学习之[八]acceptor 点滴
- Boost Asio 1.56 学习之同步定时器
- boost学习之asio—chat
- ubuntu 修改root密码
- 第六章作业
- apache2 + git + gerrit + mysql 配置、简单git操作
- device tree blob
- spring学习笔记(11)--@PostConstruct and @PreDestory
- boost::asio学习之[七] buffer
- 数据结构中 链表的创建,值的插入以及删除(一定注意头结点的作用)
- 面向对象的三个基本特征
- linux下tomcat服务的启动、关闭与错误跟踪
- Android线程学习
- Leetcode: Maximum Subarray 理解分析
- 优秀程序员的十个习惯
- 【转】maven settings.xml配置文件的作用
- 内存对齐