如何使用 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
来实现这一点。
对我来说,控制到目前为止写入文件的进程以让它打印到标准输出似乎更容易、更有效。然后我可以流式传输管道(类似于我尝试流式传输文件的方式)并自己编写文件。
但是,如果有人想走这条路,我想使用 inotify
和 boost::asio::posix::stream_descriptor
是问题的答案,至少在 GNU/Linux.[=20= 下]
我有一个本地文件,某些进程不断地附加到该文件。我想用 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
来实现这一点。
对我来说,控制到目前为止写入文件的进程以让它打印到标准输出似乎更容易、更有效。然后我可以流式传输管道(类似于我尝试流式传输文件的方式)并自己编写文件。
但是,如果有人想走这条路,我想使用 inotify
和 boost::asio::posix::stream_descriptor
是问题的答案,至少在 GNU/Linux.[=20= 下]