我正在尝试使用boost :: asio :: async_read_until从客户端获取数据包..
boost::asio::async_read_until(socket, buf, 0x78, boost::bind(&Session::ReadHandler, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
客户发送FE 42 54 89 7B 14 05 78 FE 42 55 89 7B 14 05 78并使用async_read_until我得到FE 42 54 89 7B 14 05 78.现在,我如何获得数据包的第二部分?在某些情况下,客户端在发送到服务器之前将两个或多个数据包连接在一起。
我希望这是可能的,谢谢先进!
修改1 我的代码
boost::asio::ip::tcp::socket socket;
boost::asio::streambuf buf;
void Session::Read()
{
boost::asio::async_read_until(socket, buf, 0x78, boost::bind(&Session::ReadHandler, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void Session::ReadHandler(const boost::system::error_code &error, std::size_t bytes_transferred)
{
if (!error)
{
boost::asio::streambuf::const_buffers_type data = buf.data();
std::string packet(boost::asio::buffers_begin(data), boost::asio::buffers_end(data));
buf.consume(buf.size());
}
else
{
socket.close();
}
}
答案 0 :(得分:3)
async_read_until
完全按照它的说法执行操作:在条件为真之前检索数据,在您的情况下,直到检索到0x78
。
如果您想获得更多数据,请在同一个缓冲区上执行另一个async_read_until
。
如果您正在使用UDP(所以"数据包"实际存在),那么请使用适用于数据包的内容,例如async_receive_from
编辑:查看代码(仍然不是可编译的示例),它至少需要使用bytes_transferred
来从缓冲区读取数据并消耗掉读取的内容,以及它需要在退出之前执行另一个async_read_until。