【问题标题】:boost asio: async data readingboost asio:异步数据读取
【发布时间】:2014-01-27 12:16:26
【问题描述】:

我知道这可能是一个普遍愚蠢的问题,但是有没有办法在 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));

我对这种实施方式总体上是正确的吗?

【问题讨论】:

  • async_read 的第二次调用必须来自第一次调用的完成处理程序(即handleHeaderRead);除此之外,应该没有问题。
  • @MikeSeymour 当然,如果您使用boost::asio::spawn选择协程的便利性,则除外
  • @MikeSeymour 谢谢 :)

标签: c++ boost boost-asio


【解决方案1】:

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

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

一般header是固定长度的,数据长度在header内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多