【Boost】boost库asio详解7——boost::asio::buffer用法
2014-10-21 16:59
344 查看
【Boost】boost库asio详解7——boost::asio::buffer用法
/article/7701955.html
asio::buffer有多种的构造方法,而且buffer大小是自动管理的
[cpp] view
plaincopyprint?
char d1[128];
size_t bytes_transferred = socket.receive(boost::asio::buffer(d1));
[cpp] view
plaincopyprint?
std::vector<char> d2(128);
size_t bytes_transferred = socket.receive(boost::asio::buffer(d2));
[cpp] view
plaincopyprint?
boost::array<char, 128> d3;
size_t bytes_transferred = sock.receive(boost::asio::buffer(d3));
[cpp] view
plaincopyprint?
string str = "hello world";
bytes_transferred = socket.send(boost::asio::buffer(str));
[cpp] view
plaincopyprint?
boost::asio::mutable_buffer b1 =boost::asio::buffer(str);
unsigned char* p1 = boost::asio::buffer_cast<unsigned char*>(b1);
[cpp] view
plaincopyprint?
std::size_t s1 = boost::asio::buffer_size(b1);
注意的是boost::asio::const_buffer是只读的buffer,
而boost::asio::mutable_buffer则可写。
读写buffer也是有讲究的
[cpp] view
plaincopyprint?
boost::array<char, 128> buf;
boost::system::error_code ec;
std::size_t n = boost::asio::read(
socket,
boost::asio::buffer(buf),
boost::asio::transfer_all(),
ec);
if (ec)
{
// An error occurred.
}
else
{
// n == 128
}
boost::asio::transfer_all()能够使buffer中的所有数据都传送完毕。即读满buffer为止。
[cpp] view
plaincopyprint?
std::size_t n = boost::asio::read(
socket,
boost::asio::buffer(buf),
boost::asio::transfer_at_least(64),
ec);
意义即读满64字节为止。返回。
当然还有最常用的bytes_transferred,这个例子就很多了。
/article/7701955.html
1. asio::buffer常用的构造方法
asio::buffer有多种的构造方法,而且buffer大小是自动管理的
1.1 字符数组
[cpp] viewplaincopyprint?
char d1[128];
size_t bytes_transferred = socket.receive(boost::asio::buffer(d1));
1.2 字符向量
[cpp] viewplaincopyprint?
std::vector<char> d2(128);
size_t bytes_transferred = socket.receive(boost::asio::buffer(d2));
1.3 boost的数组
[cpp] viewplaincopyprint?
boost::array<char, 128> d3;
size_t bytes_transferred = sock.receive(boost::asio::buffer(d3));
1.4 字符串
[cpp] viewplaincopyprint?
string str = "hello world";
bytes_transferred = socket.send(boost::asio::buffer(str));
2. asio::buffer的常用方法
2.1 转换方法
[cpp] viewplaincopyprint?
boost::asio::mutable_buffer b1 =boost::asio::buffer(str);
unsigned char* p1 = boost::asio::buffer_cast<unsigned char*>(b1);
2.2 获取大小
[cpp] viewplaincopyprint?
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()结合
[cpp] viewplaincopyprint?
boost::array<char, 128> buf;
boost::system::error_code ec;
std::size_t n = boost::asio::read(
socket,
boost::asio::buffer(buf),
boost::asio::transfer_all(),
ec);
if (ec)
{
// An error occurred.
}
else
{
// n == 128
}
boost::asio::transfer_all()能够使buffer中的所有数据都传送完毕。即读满buffer为止。
3.2 与transfer_at_least()结合
[cpp] viewplaincopyprint?
std::size_t n = boost::asio::read(
socket,
boost::asio::buffer(buf),
boost::asio::transfer_at_least(64),
ec);
意义即读满64字节为止。返回。
当然还有最常用的bytes_transferred,这个例子就很多了。
相关文章推荐
- 【Boost】boost库asio详解7——boost::asio::buffer用法
- boost库asio详解7——boost::asio::buffer用法
- 【Boost】boost库asio详解7——boost::asio::buffer用法
- boost库asio详解7——boost::asio::buffer用法
- boost库asio详解6——boost::asio::error的用法浅析
- boost库asio详解6——boost::asio::error的用法浅析
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
- 【Boost】boost库asio详解8——TCP的简单例子1
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- 【Boost】boost库asio详解1——io_service::run函数无任务时退出的问题
- 【Boost】boost库asio详解4——deadline_timer使用说明
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
- 【Boost】boost库asio详解8——几个TCP的简单例子
- 【Boost】boost库asio详解3——io_service作为work pool
- 【Boost】boost库asio详解3——io_service作为work pool
- 【Boost】boost库asio详解4——deadline_timer使用说明
- 【Boost】boost库asio详解4——deadline_timer使用说明
- 【Boost】boost库asio详解——boost::asio::buffer用法
- 【Boost】boost库asio详解1——strand与io_service区别