我想使用boost asio在TCP / IP堆栈之上实现协议。协议的长度 - PDU包含在前6个字节中。现在使用asio提供的同步读取方法,我可以准确读取前6个字节,计算长度 n 然后读取 n 字节以获得整个PDU。< / p>
我宁愿使用异步方法,但是在asio文档中研究example会给我一个问题。作者使用套接字成员函数async_read_some(),它从套接字中读取(看似对我而言)不确定数量的数据。 我将如何应用我的&#34;两步&#34;第一段描述的程序接收完整的PDU?或者我的问题还有另一个明智的解决方案吗?
答案 0 :(得分:4)
使用非成员函数async_read
读取固定金额。
例如,使用std::vector
或类似的缓冲区:
// read the header
buffer.resize(6);
async_read(socket, boost::asio::buffer(buffer),
[=](const boost::system::error_code & error, size_t bytes){
if (!error) {
assert(bytes == 6);
// read the payload
buffer.resize(read_size(buffer));
async_read(socket, boost::asio::buffer(buffer),
[=](const boost::system::error_code & error, size_t bytes){
if (!error) {
// process the payload
}
});
}
});