首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用boost::beast连续流式传输文件

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

Stack Overflow用户
提问于 2020-03-30 18:40:10
回答 1查看 568关注 0票数 1

我有一个本地文件,一些进程不断地附加到这个文件中。我想用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连接打开不是问题,只是在文件增长时写入进一步的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,似乎更容易、更有效。然后,我可以流式传输管道(类似于我尝试流式传输文件的方式),并自己编写文件。

然而,如果有人想要继续下去,我想使用inotifyboost::asio::posix::stream_descriptor是解决问题的答案,至少在GNU/Linux下是这样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60928756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档