boost::asio
的各种 read
和 write
函数和方法接受 boost::asio::buffer
。根据buffer文档,不可变的 std::string
无法包装在 boost::asio::buffer
中,因此不能用于 asio 的 read
函数。这可能是因为 std::string
不允许可变访问其内部缓冲区(曾在此处讨论here)。
这真是太遗憾了,因为 std::string
是表示 C++ 中可变数据缓冲区的方便方式。没有它,我们只能使用 POD 数组、boost::array
和 std::vector<char>
。前两者对于可变长度的消息很不方便。std::vector<char>
可以工作,但它是一种不自然的携带数据缓冲区的方式 (*)。
问题:
- 除了
std::string
之外,在使用boost::asio
读取缓冲区时还有其他选择吗?我是否遗漏了些什么? - 我想知道为什么可变缓冲区支持
std::vector<char>
。这是因为它保证其内部缓冲区在内存中是连续的,并允许使用&vec [0]
进行可变访问吗?
提前感谢。
(*) 在我看来。例如,看看 protobuf
序列化 - 它提供了对 std::string
的序列化,但至少没有明确提供对 std::vector<char>
的序列化。
编辑:最终我还是使用了vector<char>
。通过SerializeToArray
调用,protobuf
可以将序列化后的内容转换为vector<char>
,并且可以传递一个指针(即&vec[0]
)。
vector<char>
- 因为在对接收到的数据进行处理的所有情况下,我发现这种方法更快。但是我也看到了asio::streambuf
的使用: http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/streambuf.html。 - Nimasio::streambuf
,但它在固定大小的读取上似乎有问题,更适合像HTTP中的read_until
。但我可能漏掉了什么... - Eli Benderskyprotobuf
并不提议将序列化输出为纯文本,它的序列化输出明显看起来像二进制数据(而不是ASCII码)。 - Eli Benderskyasio::streambuf
在固定大小读取方面存在什么问题。我已经在几个项目中成功使用它,并且它与Boost.Serialization很好地集成在一起。你能否编辑你的问题以澄清你的疑虑? - Sam Millerasio::streambuf
,确实是因为我不完全清楚如何将其与固定大小的读取和asio一起使用。你能否指出一个示例(或在答案中添加一个)来展示如何将固定长度的块读入std::stringstream
? - Eli Bendersky