C++ 将ASIO同步读取X字节提升为向量

C++ 将ASIO同步读取X字节提升为向量,c++,boost,C++,Boost,我一直在尝试用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:

我一直在尝试用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.
}
vectorbuf;
对于(;;)
{
buf.调整大小(4);
boost::system::error\u code error;
size\u t len=socket.read\u some(boost::asio::buffer(buf),错误);
if(error==boost::asio::error::eof)
中断;//对等方已完全关闭连接。
else if(错误)
抛出boost::system::system_error(error);//其他一些错误。
}
数据包比4个字节大,似乎它一直在写入这4个字节,直到收到整个数据包,但是我希望它获取4个字节,然后允许我解析它们,然后获取数据包的其余部分

谁能给我一个工作的例子,或者至少一个如何使它正常工作的指针


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

读取操作可能无法读取所有请求的字节数。如果需要确保在阻塞操作完成之前读取所请求的数据量,请考虑使用读取函数。< /P> 您需要读取前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
}
向量buf(4);
尝试
{ 
size_t len=read(套接字,boost::asio::buffer(buf));
断言(len==4);
//以buf格式处理4个字节
}
捕获(boost::system::system\u错误和错误)
{
//处理错误,例如提前返回
}
boost::system::error\u code error;
而(!错误)
{
size\u t len=socket.read\u some(boost::asio::buffer(buf),错误);
//处理len字节
}