Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost iostreams:如何创建缓冲(用于读取)TCP流?_C++_Boost_Boost Asio_Iostream - Fatal编程技术网

C++ Boost iostreams:如何创建缓冲(用于读取)TCP流?

C++ Boost iostreams:如何创建缓冲(用于读取)TCP流?,c++,boost,boost-asio,iostream,C++,Boost,Boost Asio,Iostream,所以我这里的主要问题是如何在asio tcp::socket或tcp::iostream之上实现一个结构,该结构将实现 缓冲区高达1kb?我不熟悉这个特殊的升压模块。但是,如果您正在寻找一种方法来创建一个类似于某种存储库的缓冲区,我将创建另一个线程来管理它。线程可以LIFO传入流,处理过滤器请求和缓冲区管理。将它保持在一个单独的线程上意味着它将在系统缓冲区用完之前关注传入的数据包,因此您不必担心丢失任何内容。可以创建一个消息队列来在线程之间进行调解 这就是说,最终可能最容易的办法是找一个事先写

所以我这里的主要问题是如何在asio tcp::socket或tcp::iostream之上实现一个结构,该结构将实现


缓冲区高达1kb?

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

这就是说,最终可能最容易的办法是找一个事先写好的图书馆来处理它,并为自己节省一点时间。退房。

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

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

当设置内容长度头时,应该可以为特定协议(如HTTP)实现类似可查找输入的功能。但在这种情况下,固定大小的1Kb缓冲区也无法工作,除非您使用HTTP/1.1范围标头

也许这有助于:
Christopher M.Kohlhoff(Boost asio的作者)实现了(在SourceForge上标记为“Prealpha”),他将HTTP连接建模为一个istream。我认为read_some方法可能会让您感兴趣:

一个问题是很难在异步套接字上使用流。例如,从流中读取一个字符串,直到缓冲区中不再有字符串为止。但是,您(或流)如何知道它是否真的是字符串的结尾?剩下的可能会装在另一个包裹里,而且没有办法知道什么时候,或者是否会被送到。出于好奇,你看过这个吗@JoachimPileborg:这是非常容易知道的-直到您到达流的末尾或套接字出错。其余部分是严重依赖于使用的高级协议的业务逻辑。这就是说,缓冲是必要的,但是C++的IoSt流就是脑死亡。Libevent为此提供了很好的通用缓冲区API。您不能有可查找的流,因为您必须读取整个响应才能查找结束,然后数据将不可用。因此,你的缓冲区应该和你要寻找的位置一样大。很好的图表,但这不是一个特别好的SO问题,当然也不是一个值得打12分的问题。你试过什么?
s.seekg (0, ios::end);