boost库asio详解7——boost::asio::buffer用法

本文介绍了asio::buffer的各种构造方法,包括使用字符数组、字符向量、boost数组和字符串等,并详细解释了asio::buffer的常用方法,如转换方法和获取大小的方法。此外,还讨论了asio::buffer的读写问题,特别是与transfer_all()和transfer_at_least()结合使用的情况。

1. asio::buffer常用的构造方法

asio::buffer有多种的构造方法,而且buffer大小是自动管理的

1.1 字符数组

  1. char d1[128];  
  2. size_t bytes_transferred = socket.receive(boost::asio::buffer(d1));  

1.2 字符向量

  1. std::vector<char> d2(128);  
  2. size_t bytes_transferred = socket.receive(boost::asio::buffer(d2));  

1.3 boost的数组

  1. boost::array<char, 128> d3;  
  2. size_t bytes_transferred = sock.receive(boost::asio::buffer(d3));   

1.4 字符串

  1. string str = "hello world";  
  2. bytes_transferred = socket.send(boost::asio::buffer(str));   

2. asio::buffer的常用方法

2.1 转换方法

  1. boost::asio::mutable_buffer b1 =boost::asio::buffer(str);  
  2. unsigned char* p1 = boost::asio::buffer_cast<unsigned char*>(b1);  

2.2 获取大小

  1. std::size_t s1 = boost::asio::buffer_size(b1);  

3. asio::buffer的读写问题

注意 的是boost::asio::const_buffer是只读的buffer, 而boost::asio::mutable_buffer则可写。
读写buffer也是有讲究的 

3.1 与transfer_all()结合

  1. boost::array<char, 128> buf;  
  2. boost::system::error_code ec;  
  3. std::size_t n = boost::asio::read(  
  4.     socket,  
  5.     boost::asio::buffer(buf),  
  6.     boost::asio::transfer_all(),  
  7.     ec);  
  8. if (ec)  
  9. {  
  10.   // An error occurred.  
  11. }  
  12. else  
  13. {  
  14.   // n == 128  
  15. }  
boost::asio::transfer_all()能够使buffer中的所有数据都传送完毕。即读满buffer为止。

3.2 与transfer_at_least()结合

  1. std::size_t n = boost::asio::read(  
  2.     socket,  
  3.     boost::asio::buffer(buf),  
  4.     boost::asio::transfer_at_least(64),  
  5.     ec);  
意义即读满64字节为止。返回。
当然还有最常用的 bytes_transferred ,这个例子就很多了。 
Boost.Asio是一个强大的C++,用于网络和低级通信的异步I/O操作。它支持多种协议,包括TCP、UDP、HTTP、SMTP等,并提供了一套简洁而高效的API,使得编写高性能、可维护的网络应用变得容易。 Asio的核心是其异步IO模型,它允许开发者同时处理多个连接,避免了传统同步阻塞式I/O可能导致的性能瓶颈。它的设计基于C++11标准的std::future和std::async,开发者可以方便地发起异步操作并立即返回,后续的操作会在后台完成,提高了程序的响应速度。 以下是Asio的一些关键特性: 1. 异步处理:通过回调函数或Future/Promise模式处理I/O操作的结果,不会阻塞主线程。 2. 高效的事件驱动架构:事件循环监听各种I/O事件,当事件发生时,触发相应的处理函数。 3. 支持多线程并发:通过分发工作到不同的线程池,实现资源的有效利用。 4. 网络:包含丰富的网络服务端和客户端编程模块,如TCP、UDP、HTTP、WebSocket等。 5. 文件系统访问:提供异步文件读写功能。 在实际使用中,首先需要包含Boost.Asio头文件,然后创建一个Executor(线程池或者其他执行环境),接着可以创建Socket对象,设置选项,发起连接请求或数据发送等,所有的操作都是异步的。例如: ```cpp #include <boost/asio.hpp> auto io = std::make_shared<boost::asio::io_context>(); // 创建异步TCP socket boost::asio::ip::tcp::socket socket(*io); // 连接目标地址 boost::asio::connect(socket, ...); // 发送数据 socket.async_write_some(boost::asio::buffer(data), [&, error](auto ec) { if (!ec) // 成功处理结果... }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值