首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >与boost::asio一起使用的std::string的替代方案

与boost::asio一起使用的std::string的替代方案
EN

Stack Overflow用户
提问于 2011-03-09 23:49:24
回答 3查看 6.4K关注 0票数 19

boost::asio的各种readwrite函数和方法接受boost::asio::buffer。根据buffer's documentation的说法,可变的std::string不能包装在boost::asio::buffer中,因此不能用于asio的read函数。这可能是因为std::string不允许可变访问其内部缓冲区的事实(这已经在<代码>C9中讨论过了)。

这是一种遗憾,因为std::string是在C++中表示可变数据缓冲区的一种方便方法。如果没有它,我们只能使用POD数组、boost::arraystd::vector<char>。前两个对于可变长度的消息是不方便的。std::vector<char>可以工作,但它是一种不自然的携带数据缓冲区的方式(*)

问题:

  1. 有没有其他替代std::stringboost::asio的读取缓冲区的方法?我是不是错过了什么?
  2. 我想知道为什么可变缓冲区支持std::vector<char>。是因为它保证了它的内部缓冲区在内存中是连续的,并允许使用&vec[0]对它进行可变访问吗?

提前感谢

(*) IMHO。看看protobuf序列化的例子-它提供到std::string的序列化,但没有到std::vector<char>的序列化,至少不是显式的。

编辑:我最终还是使用了vector<char>protobuf允许通过接受指针的SerializeToArray调用(可以将&vec[0]传递到那里)来序列化到vector<char>中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-12 01:13:51

这是为了回答Eli的评论

我最初没有在我的问题中提到asio::streambuf,实际上是因为我不是100%清楚如何在固定大小的读取和asio中使用它。您能否举出一个示例(或添加一个作为答案)来说明如何将固定长度的块读取到std::sstream中?

下面是关于使用asio::streambufBoost.Serializationa previous answer。asio documentation也有一个同步读取的示例:

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;
票数 5
EN

Stack Overflow用户

发布于 2011-03-10 06:24:07

使用&str[0]对字符串缓冲区的可变访问在所有已知的实现上都工作得很好,而且即将发布的C++0x标准化的措辞正式允许这样做。

不过,我认为如果认为std::vector是可变长度缓冲区的一种不自然的表示形式,那就太疯狂了。

票数 8
EN

Stack Overflow用户

发布于 2011-03-10 06:19:08

1)可以通过检查asio::buffer()函数、返回mutable_buffers_1的重载来找到替代方法。更灵活(但可能不是最优的)选项是asio::streambuf,它对(async_)read_until很有用。

如果你有固定大小的字段协议,你可以使用asio::mutable_buffer数组。例如:

using boost::asio;
int i;
short s;
char data[data_size]; // data_size is defined elsewhere
boost::array<asio::mutable_buffer, 3> bufs = {
    asio::buffer(&i, 4), 
    asio::buffer(&s, 2),
    asio::buffer(data, data_size)
};
asio::read(socket, buffer(bufs)); // socket defined elsewhere

2)你已经引用了这个问题的很好的答案:"How to asynchronously read to std::string using Boost::asio?"

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5248291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档