[英]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.