2011-02-08 66 views
6

我有一台服务器从客户端接收一个压缩字符串(用zlib压缩),并且我使用boost::asio库中的async_receive来接收这个字符串,但事实证明,不能保证所有字节都会被接收到,所以我现在必须将其更改为async_read。我面临的问题是收到的字节大小是可变的,所以我不知道如何使用async_read而不知道要接收的字节数。与async_receive我只是有一个boost::array<char, 1024>,但是这是一个缓冲区,不一定完全填满。boost :: asio async_read保证所有字节被读取

我想知道是否有人可以建议一个解决方案,我可以使用async_read,即使我不知道预先收到的字节数?

void tcp_connection::start(boost::shared_ptr<ResolverQueueHandler> queue_handler) 
{ 
    if (!_queue_handler.get()) 
     _queue_handler = queue_handler; 

    std::fill(buff.begin(), buff.end(), 0); 

    //socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error)); 
    boost::asio::async_read(socket_, boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error)); 
} 

buffboost::array<char, 1024>

回答

19

您是如何期望使用其他方法做到这一点?

有几种通用方法在一个异步庄园发送可变大小的数据:

  1. 按信息 - 这意味着有一个定义,接着含有体的预期消息的长度的报头指定长度的数据。
  2. 流 - 意味着你有一些标记(这是非常宽泛的)知道你什么时候得到一个完整的数据包的方法。
  3. 通过连接 - 每个完整的数据包在单个连接中发送,数据完成后关闭。

所以可以将数据进行解析,或长度发送等等

+4

+1对一些可能的解决方案的不错总结 – 2011-02-08 14:37:36

0

单个IP包限于〜1500个字节的MTU大小,但仍然可以下载千兆字节的大文件从您最喜爱的网站上下载,并在YouTube上观看兆字节大小的视频。

您需要发送一个指示原始数据实际大小的标头,然后在小块上接收数据,直到完成接收所有字节为止。

例如,当您通过HTTP下载大文件时,标题上会有一个字段指示文件大小:Content-Length:

相关问题