2014-01-27 136 views
3

我知道这可能是一个普遍愚蠢的问题,但有没有一种方法可以实现tcp中的多级异步数据读取,其中:a)我们读取前四个字节 - 其中字节3 & 4对应到剩余数据包的大小 b)我们从步骤a中读取基于其有限大小的剩余数据包(数据)。boost asio:异步数据读取

我在考虑使用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');除此之外,应该没有问题。 –

+0

@MikeSeymour除了当然,如果你选择'boost :: asio :: spawn'的协程的便利性 – sehe

+0

@MikeSeymour谢谢:) – Edgar

回答

0

是的,大多数网络protocoles存储数据的动态大小在数据之前,其附带的固定尺寸字段传送,例如:

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

通常标头的固定长度,并且数据长度在标题内。

相关问题