提升iostreams:如何创建缓冲(用于读取)TCP流?

时间:2012-02-10 13:52:36

标签: c++ boost boost-asio iostream

所以我的主要问题是如何在asio tcp :: socket或tcp :: iostream之上实现一个实现some kind of input-seekable filter的结构  enter image description here

缓冲区最多说1kb

2 个答案:

答案 0 :(得分:1)

我认为对于TCP连接来说,“转到流的末尾”是不可能的。 如果这样的调用(参见下面的代码)等待(阻止)连接关闭?如何在响应达到缓冲区大小时(例如1Kb)存储响应?

s.seekg (0, ios::end);

因此,通常很难(/不可能?)实现可搜索的TCP流。即使你有一个无限的缓冲区(不仅仅是1Kb)。

当设置Content-Length头时,应该可以实现诸如HTTP(S)之类的特定协议的输入可搜索之类的东西。但在这种情况下,除非使用HTTP / 1.1 Range标头,否则1Kb的固定大小缓冲区将无法工作。

也许有帮助: Christopher M. Kohlhoff(Boost asio的作者)实现了Urdl(在SourceForge上标记为'Prealpha'),他将HTTP连接建模为istream。我认为read_some方法对您来说很有意思:https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426

答案 1 :(得分:0)

我不熟悉这个特殊的升压模块。但是,如果你正在寻找一种方法来创建一个缓冲区,它就像一个类型的存储库,我会创建另一个线程来管理它。线程可以LIFO传入流,处理过滤器请求和缓冲区管理。将它保存在一个单独的线程上意味着它会在系统缓冲区用完之前关注传入的数据包,因此您不必担心丢失任何内容。可以创建消息队列以在线程之间进行调解。

也就是说,最终可能最容易找到预先编写的图书馆来处理它并节省一点时间。查看this post