【问题标题】:How to stream a file continuously with boost::beast如何使用 boost::beast 连续流式传输文件
【发布时间】:2020-03-30 10:40:10
【问题描述】:

我有一个本地文件,一些进程不断地附加到该文件中。我想通过boost::beast 提供该文件。

到目前为止,我使用boost::beast::http::response<boost::beast::http::file_body>boost::beast::http::async_write 将文件发送到客户端。这工作得很好,很高兴boost::beast 照顾一切。但是,当到达文件末尾时,它会停止异步写入。我认为这是因为底层serializeris_done 在此时返回true

是否可以保持异步写入持续进行,以便随着本地文件的增长将新内容写入客户端(类似于tail -f 将文件内容持续写入标准输出的方式)?

我认为我可能需要使用boost::beast::http::response_serializer<boost::beast::http::file_body> 进行这种自定义,但我不确定如何正确使用它。我是否需要为此使用分块编码?

请注意,保持 HTTP 连接打开不是问题,只有在文件增长时才写入进一步的输出。

【问题讨论】:

    标签: c++ http boost boost-asio boost-beast


    【解决方案1】:

    经过一些研究,这个问题似乎不容易解决,至少在我目前关注的 GNU/Linux 下不是这样。

    可以使用boost::beast 文档中描述的分块编码。我已经实现了从文件内容异步服务块,这些文件内容也是在boost::asio::posix::stream_descriptor 的帮助下异步读取的。这工作得很好。但是,一旦到达文件末尾,它也会因文件结尾错误而停止。通过描述符使用async_wait 时,我收到错误“不支持操作”。

    因此,似乎不可能异步等待更多字节写入文件。考虑到tail -f 就是这样做的,这很奇怪。所以我有straceed tail -f,结果它调用了inotify_add_watch(4, "path_to_file", IN_MODIFY)。因此我假设实际上需要使用inotify 来实现这一点。

    对我来说,到目前为止,控制写入文件的过程以让它打印到标准输出似乎更容易、更有效。然后我可以流式传输管道(类似于我尝试流式传输文件的方式)并自己编写文件。

    但是,如果有人想继续前进,我想使用 inotifyboost::asio::posix::stream_descriptor 是问题的答案,至少在 GNU/Linux 下是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      相关资源
      最近更新 更多