boost::asio 从套接字读取 n 个字节到 Streambuf
boost::asio read n bytes from socket to streambuf
我有一个序列化结构,它是通过套接字发送的。我需要分块读取它,因为它的一个字段包含剩余数据的大小:我需要读取前几个字节,找出长度并读取其余部分。这是我得到的:
boost::asio::streambuf buffer;
boost::system::error_code err_code;
// here I need to read only first 16 bytes
boost::asio::read(socket, buffer, err_code);
std::istream is(&buffer);
boost::archive::binary_iarchive ia(is);
ia >> my_struct;
我看了一下
boost::asio::async_read(s, boost::asio::buffer(data, size), handler);
但它只能读取数据来提升::ASIO::缓冲区。我想知道我是否可以用 boost::asio::streambif 做同样的事情?提前谢谢你。
boost::asio::read()
和 boost::asio::async_read()
都有重载,它们接受 boost::asio::basic_streambuf
实例作为其缓冲区:
read(SyncReadStream&, basic_streambuf&);
read(SyncReadStream&, basic_streambuf&, CompletionCondition);
read(SyncReadStream&, basic_streambuf&, boost::system::error_code&);
read(SyncReadStream&, basic_streambuf&, CompletionCondition,
boost::system::error_code&);
async_read(AsyncReadStream&, basic_streambuf&, ReadHandler);
async_read(AsyncReadStream&, basic_streambuf&, CompletionCondition,
ReadHandler);
当调用不接受 CompletionCondition 的重载时,它等效于调用其关联的重载,CompletionCondition 为 boost::asio::transfer_all()
,导致操作读取 streambuf.max_size()
字节。
要将已知数量的字节读入 streambuf,请使用:
boost::asio::transfer_exactly(n)
完成条件来限制从组合操作传输的字节数:std::size_t n = // ... boost::asio::read(socket, streambuf, boost::asio::transfer_exactly(n), error);
显式创建将用作缓冲区的输出序列,然后将读取的字节提交到 streambif 的输入序列中:
std::size_t n = // ... std::size_t bytes_transferred = boost::asio::read(socket, streambuf.prepare(n), // creates a boost::asio::buffer error); streambuf.commit(bytes_transferred);
下面是演示这两种方法的完整示例:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
// This example is not interested in the handlers, so provide a noop function
// that will be passed to bind to meet the handler concept requirements.
void noop() {}
std::string make_string(boost::asio::streambuf& streambuf)
{
return {boost::asio::buffers_begin(streambuf.data()),
boost::asio::buffers_end(streambuf.data())};
}
int main()
{
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
// Create all I/O objects.
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 0));
tcp::socket server_socket(io_service);
tcp::socket client_socket(io_service);
// Connect client and server sockets.
acceptor.async_accept(server_socket, boost::bind(&noop));
client_socket.async_connect(acceptor.local_endpoint(), boost::bind(&noop));
io_service.run();
// Write to server.
boost::asio::streambuf write_buffer;
std::ostream output(&write_buffer);
output << "abc";
std::cout << "Writing: " << make_string(write_buffer) << std::endl;
auto bytes_transferred = boost::asio::write(server_socket, write_buffer);
// Read from client.
boost::asio::streambuf read_buffer;
bytes_transferred = boost::asio::read(client_socket, read_buffer,
boost::asio::transfer_exactly(bytes_transferred));
std::cout << "Read: " << make_string(read_buffer) << std::endl;
read_buffer.consume(bytes_transferred); // Remove data that was read.
// Write to server.
output << "def";
std::cout << "Writing: " << make_string(write_buffer) << std::endl;
bytes_transferred = boost::asio::write(server_socket, write_buffer);
// Read from client.
bytes_transferred = boost::asio::read(client_socket,
read_buffer.prepare(bytes_transferred));
read_buffer.commit(bytes_transferred);
std::cout << "Read: " << make_string(read_buffer) << std::endl;
read_buffer.consume(bytes_transferred); // Remove data that was read.
}
输出:
Writing: abc
Read: abc
Writing: def
Read: def
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 从boost asio streambuf读取会将字节保持在缓冲区中
- boost::asio 从套接字读取 n 个字节到 Streambuf