如何使用 boost::beast 连续流式传输文件

How to stream a file continuously with boost::beast

我有一个本地文件,某些进程不断地附加到该文件。我想用 boost::beast.

提供该文件

到目前为止,我正在使用 boost::beast::http::response<boost::beast::http::file_body>boost::beast::http::async_write 将文件发送到客户端。这工作得很好,很高兴 boost::beast 照顾好一切。但是,当到达文件末尾时,它会停止异步写入。我假设这是因为 is_done 的基础 serializer returns true 在这一点上。

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

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

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

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

可以使用 boost::beast 文档中描述的分块编码。我已经实现了从文件内容异步提供服务块,这些文件内容也是在 boost::asio::posix::stream_descriptor 的帮助下异步读取的。效果很好。但是,一旦到达文件末尾,它也会因文件结束错误而停止。通过描述符使用 async_wait 时出现错误 "Operation not supported".

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

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

但是,如果有人想走这条路,我想使用 inotifyboost::asio::posix::stream_descriptor 是问题的答案,至少在 GNU/Linux.[=20= 下]