【问题标题】:Asio sync-read random-access with exceptions, how many bytes were read?Asio sync-read random-access with exceptions,读取了多少字节?
【发布时间】:2023-02-16 06:35:22
【问题描述】:

我们如何知道在随机访问设备上调用同步读取操作并抛出异常时读取了多少字节,例如 random_access_file

这是否不受支持,要知道读取了多少字节,应该采用 boost::system::error_code ec 重载?

error_code ec;
size_t s = a.read_some_at(offset, buffers, ec);
offset += s; // need to be done before unwinding
if (ec) throw system_error(ec);
return s;

【问题讨论】:

    标签: c++ boost asio


    【解决方案1】:

    简短回答:是的。以ec 超载为例。 Asio 的部分成功操作就是这种情况。

    稍长(不相关)的答案:使用例如c++20协程你可以让错误代码和字节数返回as a tuple,你可能会觉得更方便:

    auto [ec, s] = a.async_read_some_at(offset, buffers, asio::as_tuple(asio::use_awaitable)));
    

    烦恼:as_tuple 目前(最后检查 1.80.0)似乎不能与 asio::use_future 一起使用:(

    【讨论】:

    • 我更喜欢几乎总是采用ec 重载,如果需要,您始终可以在应用程序层中抛出异常。 boost很少有全部抛出异常时的相关细节,让您正确诊断问题。
    • 谢谢!我正在编写一个类似流的类,它只是包装一个随机访问文件并向其传递一个偏移量,并且其中有一个偏移量整数,只要在其上调用 read_some / async_read_some 就会递增。这就是为什么我需要知道读取了多少字节。仍然需要弄清楚如何在 async_{read,write}_some 情况下获取读/写字节数。好像我需要包装令牌并拦截“bytes_read”整数。我仍在研究如何正确地做到这一点而不会丢失关联的执行者等任何东西。这是“完成令牌适配器”的东西吗?
    • 目标是当从文件中读取连续记录时,我可以将 boost::buffered_stream 与随机访问文件一起使用。
    • @JohannesSchaub-litb 通常使用异步完成会公开错误代码和传输的字节(例如使用处理程序 void(error_code, size_t) 或确实使用 as_tuple(use_awaitable)。后者确实在 Completion Token Adaptors 下进行了描述。如前所述,它没有' use_future 不能很好地发挥作用,但这无论如何都不是异步的。
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 2012-10-19
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多