Boost Asio:异步数据读取

3
我知道这可能是一个很愚蠢的问题,但是否有一种实现TCP多阶段异步数据读取的方法: a)我们首先读取前四个字节-其中第3和第4个字节对应于剩余数据包的大小 b)根据步骤a中给出的有限大小读取剩余数据包(数据)。
我考虑使用async_read实现。类似这样:
    char hd_buf[3];

boost::asio::async_read(
    conn->getNetSocket(),
    boost::asio::buffer(hd_buf, 3),
    boost::bind(&TCPServer::handleHeaderRead, this, boost::asio::placeholders::error));

auto dt_sz = &hd_buf[2] + &hd_buf[3]; //nvm this part, it exists in handleHeaderRead

char* dt_buf = new dt_buf[dt_sz];

boost::asio::async_read(
    conn->getNetSocket(),
    boost::asio::buffer(dt_buf, dt_sz),
    boost::bind(&TCPServer::handleDataRead, this, boost::asio::placeholders::error));

我这样的实现方式是否正确?

1
第二次调用async_read必须从第一次调用的完成处理程序(即handleHeaderRead)中进行;除此之外,不应该有任何问题。 - Mike Seymour
除非你选择使用 boost::asio::spawn 的协程便利性,否则 @MikeSeymour - sehe
@MikeSeymour 谢谢 :) - Edgar
1个回答

0

是的,大多数网络协议将要传输的数据的动态大小存储在数据之前的固定大小字段中,例如:

[ size ][  data...  ]
 4bytes  `size`bytes

一般来说,报头具有固定的长度,并且数据长度在报头内部。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接