boost :: asio :: async_read_until没有得到完整的数据包

时间:2014-07-12 02:32:51

标签: c++ boost boost-asio packet

我正在尝试使用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();
    }
}

1 个答案:

答案 0 :(得分:3)

async_read_until完全按照它的说法执行操作:在条件为真之前检索数据,在您的情况下,直到检索到0x78

如果您想获得更多数据,请在同一个缓冲区上执行另一个async_read_until

如果您正在使用UDP(所以"数据包"实际存在),那么请使用适用于数据包的内容,例如async_receive_from

编辑:查看代码(仍然不是可编译的示例),它至少需要使用bytes_transferred来从缓冲区读取数据并消耗掉读取的内容,以及它需要在退出之前执行另一个async_read_until

相关问题