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

标签 c++ http boost boost-asio boost-beast

我有一个本地文件,某些进程会不断将其附加到文件中。我想使用boost::beast服务该文件。

到目前为止,我正在使用boost::beast::http::response<boost::beast::http::file_body>boost::beast::http::async_write将文件发送到客户端。效果很好,boost::beast可以处理所有事情。但是,到达文件末尾时,它将停止异步写入。我认为这是因为基础is_doneserializer此时返回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确实做到了这一点,这很奇怪。所以我将stracetail -f进行了比较,结果发现它调用了inotify_add_watch(4, "path_to_file", IN_MODIFY)。因此,我认为实际上需要使用inotify来实现这一点。

对我而言,控制到目前为止写入文件的过程,使它可以打印到stdout似乎更加容易和有效。然后,我可以流式传输管道(类似于我尝试流式传输文件的方式)并自己编写文件。

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

关于c++ - 如何使用boost::beast连续流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60928756/

相关文章:

c++ - 想要检查模板参数是否为 std::endl

c++ - 使用指向 QObject 的原始指针作为信号参数是否安全?

ios - POST 请求响应 400

c# - 如何获取 HttpWebRequest 和 WebResponse 的字节大小?

c++ - boost 几何交集给出奇怪的结果

c++ - boost asio 读缓冲区

c++ - OpenCV 和 Pcl 基于 OSX 构建导致对象格式错误(加载命令 ## cmdsize 为零)

c++ - 如何将右值 std::vector 传递给函数?

asp.net - 如何处理 ASP.NET 站点中的 ASP 请求?

c++ - 我如何可靠地判断 boost 线程是否已退出其 run 方法?