我有一个需要通过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));
但有时我读了多个数据包。我需要改变它才能读取一个数据包数据吗?
答案 0 :(得分:3)
你不能。你的网络概念很混乱,TCP比那更高级。
如果您确实需要操作单个数据包,请使用UDP。对于最小的情况,它很容易切换。
答案 1 :(得分:0)
实际控制它的方法是传递你想要读取的字节数而不是缓冲区的大小。
您可以将数据包中的字节数放在数据包标头中的标准偏移量中。首先读取数据包标头的大小。然后获取数据包中的字节数(减去数据包头的大小)并读取那么多字节。
或者,继续让它读取多个数据包。处理该数据包。处理完第一个数据包后,确定是否读取了多个数据包,如果是,则将其存储到数据包缓冲区的开头。如果你的缓冲区中有一个完整的数据包,请处理,如果没有,请在memcpy结束的地方阅读更多信息。