我有一个本地文件,某些进程会不断将其附加到文件中。我想使用boost::beast
服务该文件。
到目前为止,我正在使用boost::beast::http::response<boost::beast::http::file_body>
和boost::beast::http::async_write
将文件发送到客户端。效果很好,boost::beast
可以处理所有事情。但是,到达文件末尾时,它将停止异步写入。我认为这是因为基础is_done
的serializer
此时返回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
时,出现错误“不支持操作”。
因此,似乎根本不可能异步等待更多字节写入文件。考虑到tail -f
确实做到了这一点,这很奇怪。所以我将strace
和tail -f
进行了比较,结果发现它调用了inotify_add_watch(4, "path_to_file", IN_MODIFY)
。因此,我认为实际上需要使用inotify
来实现这一点。
对我而言,控制到目前为止写入文件的过程,使它可以打印到stdout似乎更加容易和有效。然后,我可以流式传输管道(类似于我尝试流式传输文件的方式)并自己编写文件。
但是,如果有人想走这条路,我想至少在GNU / Linux下,使用inotify
和boost::asio::posix::stream_descriptor
是这个问题的答案。
关于c++ - 如何使用boost::beast连续流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60928756/