繁体   English   中英

Boost ASIO同步读取X字节到向量中

[英]Boost ASIO read X bytes synchroniously into a vector

我一直在尝试用boost编写一个客户端/服务器应用程序,到目前为止它发送和接收但我似乎无法将X字节读入一个向量。

如果我使用以下代码

vector<uint8_t> buf;

for (;;)
{
 buf.resize(4);
 boost::system::error_code error;

 size_t len = socket.read_some(boost::asio::buffer(buf), error);

 if (error == boost::asio::error::eof)
  break; // Connection closed cleanly by peer.
 else if (error)
  throw boost::system::system_error(error); // Some other error.
}

并且数据包大于4个字节然后它似乎一直写入这4个字节,直到收到整个数据包,但我希望它获取4个字节,然后允许我解析它们,然后获取其余的数据包。

任何人都可以为我提供一个工作示例,或至少指出如何使其正常工作?

问候,Xeross

你说套接字有超过4个字节可供读取,在这种情况下你的代码正确地连续循环,因为在读取所有数据之前不会遇到eof。 在我看来,你想使用read()而不是read_some(),因为后者可能返回少于你想要的四个字节。 来自read_some文档。

read_some操作可能无法读取所有请求的字节数。 如果需要确保在阻塞操作完成之前读取所请求的数据量,请考虑使用read函数。

您需要读取前4个字节(使用read),处理它们(您不需要在循环中执行此操作),然后执行循环读取并处理数据,直到出现错误条件或eof。

我想你想要更多如下:

vector<uint8_t> buf(4);
try
{ 
  size_t len = read(socket, boost::asio::buffer(buf));
  assert(len == 4);
  // process the 4 bytes in buf
}
catch (boost::system::system_error &err)
{
  // handle the error e.g by returning early
}

boost::system::error_code error;

while (!error)
{
  size_t len = socket.read_some(boost::asio::buffer(buf), error);

  // process len bytes
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM