如何在异步提升中只读取一个数据包数据?

时间:2012-05-07 12:25:09

标签: c++ boost tcp boost-asio

我有一个需要通过tcp读取数据的tcp客户端 但我每次都需要读一个tcp包数据。

我使用这段代码:

        socket_[socket_index]->async_receive(
            boost::asio::buffer(buf, max_size),
            boost::bind(
              &pipe::handle_read, shared_from_this(),
              boost::asio::placeholders::error,
              socket_index,
              boost::asio::placeholders::bytes_transferred));

但有时我读了多个数据包。我需要改变它才能读取一个数据包数据吗?

2 个答案:

答案 0 :(得分:3)

你不能。你的网络概念很混乱,TCP比那更高级。

如果您确实需要操作单个数据包,请使用UDP。对于最小的情况,它很容易切换。

答案 1 :(得分:0)

实际控制它的方法是传递你想要读取的字节数而不是缓冲区的大小。

您可以将数据包中的字节数放在数据包标头中的标准偏移量中。首先读取数据包标头的大小。然后获取数据包中的字节数(减去数据包头的大小)并读取那么多字节。

或者,继续让它读取多个数据包。处理该数据包。处理完第一个数据包后,确定是否读取了多个数据包,如果是,则将其存储到数据包缓冲区的开头。如果你的缓冲区中有一个完整的数据包,请处理,如果没有,请在memcpy结束的地方阅读更多信息。