带升压 ASIO 的"two-step" async_read
"two-step" async_read with boost asio
我想使用boost asio在TCP/IP堆栈的顶部实现一个协议。协议PDU的长度包含在它的前6个字节中。现在使用asio提供的同步读取方法,我可以精确读取前6个字节,计算长度n,然后精确读取n字节,以获得整个PDU。
不过,我更愿意使用异步方法,但研究asio文档中的示例会给我留下一个问题。作者使用了套接字成员函数async_read_some(),它从套接字中读取(对我来说)不确定数量的数据。我将如何应用第一段中描述的"两步"程序来接收完整的PDU?或者我的问题还有其他可取的解决办法吗?
使用非成员函数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
}
});
}
});
相关文章:
- 为什么std::async使用同一个线程运行函数
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 使用用户定义的参数调用future/async并调用类方法
- 使用 std::async 时死锁,将来作为成员
- 为什么我不能将引用作为 std::async 的函数参数传递
- std::async from std::async in windows xp
- Google Cloud Pubsub Async Streaming API in C++
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- -fno-unwind-tables 和 -fno-async-unwind-tables 不起作用 NDK clang
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- std::async 不会立即调用
- async中没有匹配的函数(模板中未解析的类型)
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- OpenCV(3.4.1) 错误:断言失败(变暗 <= 2 && step[0] > 0) in cv::Mat::locateROI
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 可能的 std::async 实现错误 Windows
- 为什么使用线程池时嵌套调用 boost::async 会阻塞?
- 带升压 ASIO 的"two-step" async_read