2011-02-08 135 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:

相關問題