boost::asio的各种read和write函数和方法接受boost::asio::buffer.根据buffer的文档,std::string不能包含mutable boost::asio::buffer,因此不能用于asio的read函数.这可能是由于这样的事实,std::string不允许其内部缓冲区可变访问(这是以前讨论这里).
这是一种耻辱,因为它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>毕竟我最终使用了.protobuf允许vector<char>通过SerializeToArray带有指针的调用(&vec[0]可以在那里传递)进行序列化.
使用&str[0]所有已知实现的工作正常可变地访问字符串缓冲区,并且即将推出的C++ 0x标准化的措辞使其正式允许.
尽管如此,我认为你认为a std::vector是一个不自然的可变长度缓冲区表示你是疯了.
这是为了回答Eli的评论
我最初在我的问题中没有提到asio :: streambuf,的确因为我不能100%清楚如何使用固定大小的读取和asio.你能指出一个例子(或添加一个作为答案)来展示如何将固定长度的块读入一个
std::sstream?
这是关于使用和的先前答案.asio 文档还有一个同步读取的示例:asio::streambufBoost.Serialization
boost::asio::streambuf b;
// reserve 512 bytes in output sequence
boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(512);
size_t n = sock.receive(bufs);
// received data is "committed" from output sequence to input sequence
b.commit(n);
std::istream is(&b);
std::string s;
is >> s;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6111 次 |
| 最近记录: |