我有一些使用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.
}
答案 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)