如何附加read_some缓冲区?

时间:2011-10-25 21:06:39

标签: c++ boost boost-asio

我有一些使用read_some()的客户端asio代码,直到读取了字节数。但是从查看所有示例,我无法弄清楚如何将读缓冲区组装成包含整个消息的较大缓冲区。我该怎么做?

boost::array<char, 4096> buf;
while (lnTotalBytesRead < BigMessageSize)
{
    size_t len = obj->socket_.read_some(boost::asio::buffer(buf), error);
    lnTotalBytesRead += len;
    // Need to append each received block into large block.
}

3 个答案:

答案 0 :(得分:2)

不要read_some,请read

一次读取整个缓冲区
boost::array<char, BigMessageSize> buf;
boost::asio::read(obj->socket_, boost::asio::buffer(buf), error);

答案 1 :(得分:0)

如果您并不真的希望消息太长,Andy的回答在我看来是推荐的方法

通常你必须附上你的信息,直到你有一个工作单位可以继续做某事 - 这强烈暗示你的信息需要一些标记结构(标题,正文等),所以你可以隔离来自它的个人信息。

您可以执行的最简单的标记结构是每条消息开头的4字节字,表示消息的长度。然后,您必须附加read_some并检查何时收到消息全长,然后再将其发送给进一步处理

答案 2 :(得分:0)

  

我无法弄清楚如何将读缓冲区组装成更大的缓冲区   包含整个消息。我该怎么做?

使用streambuf代替boost::array作为缓冲区。但是,正如Andy said你真的应该使用read()。正如文档所述,它是一个组合操作,并处理为您调用read_some()

  

此操作是根据对零的或多个调用实现的   stream的read_some函数。