我有一个本地文件,一些进程不断地附加到这个文件中。我想用boost::beast提供这个文件。
到目前为止,我使用boost::beast::http::response<boost::beast::http::file_body>和boost::beast::http::async_write将文件发送到客户端。这工作得很好,而且boost::beast会处理所有的事情。但是,当到达文件末尾时,它会停止异步写入。我认为这是因为在这一点上底层serializer的is_done返回true。
是否可以保持异步写入,以便在本地文件增长时将新内容写入客户端(类似于tail -f将文件内容持续写入标准输出的方式)?
我认为我可能需要使用boost::beast::http::response_serializer<boost::beast::http::file_body>来进行这种自定义,但我不确定如何正确使用它。为此,我需要使用分块编码吗?
请注意,保持HTTP连接打开不是问题,只是在文件增长时写入进一步的输出。
发布于 2020-03-31 21:34:34
经过一些研究,这个问题似乎不容易解决,至少在我目前关注的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来实现这一点。
对我来说,控制到目前为止写入文件的进程,让它打印到stdout,似乎更容易、更有效。然后,我可以流式传输管道(类似于我尝试流式传输文件的方式),并自己编写文件。
然而,如果有人想要继续下去,我想使用inotify和boost::asio::posix::stream_descriptor是解决问题的答案,至少在GNU/Linux下是这样。
https://stackoverflow.com/questions/60928756
复制相似问题