簡體   English   中英

Boost::asio async_read 調用 2 次

[英]Boost::asio async_read call 2 times

我嘗試調用 async_read function 2 次,因為我想獲取 header 並計算數據大小,然后根據計算的大小獲取數據,但處理程序被 async_read ZC1C425268E68385D1AB507 調用 1 次。

文章說當緩沖區已滿或發生錯誤時處理程序調用。 我檢查緩沖區並且已滿,但沒有第二次調用處理程序。

int calculateSize(uint8_t Header[]) {

    if (Header[2] == 0)
        return Header[3]-4;
    return (Header[2] * 256 + Header[3])-4;

}

void read_handler(
    const boost::system::error_code& ec,
    std::size_t bytes_transferred)
{
    if (ec) {
        cout << ec.message() << endl;
    }
    else
    {
        cout <<"Bytes received "<< bytes_transferred << endl;
    }
}

int receive_packet(Tcp_connection* connection) {
    int len = 0;
    uint8_t Header[4];

    async_read(*connection->sock, boost::asio::buffer(Header, sizeof(Header)),
        boost::bind(&read_handler,connection->ec,boost::asio::placeholders::bytes_transferred));
    connection->io_service->run();

    int dataSize = calculateSize(Header);
    uint8_t* Data = new uint8_t[dataSize];

        async_read(*connection->sock, boost::asio::buffer(Data, dataSize),
            boost::bind(&read_handler, connection->ec, boost::asio::placeholders::bytes_transferred));
        connection->io_service->run();
}

我想將 async_read 用於項目未來。

從代碼中我看到你想先讀取 4 個字節,然后讀取 N 個字節。

簡而言之,您需要在第一次讀取的回調中安排下一次讀取。

你應該這樣做:

// schedule read of a header
async_read(*connection->sock, boost::asio::buffer(Header, sizeof(Header)),
        [](...){
  // handler N1
  read_handler(...);
  
  // schedule read of second part
  async_read(*connection->sock, boost::asio::buffer(Data, dataSize),
            [](...){
    // handler N2
    read_handler(...);
  });
 
});
    

順便說一下,這被稱為“回調地獄”,當您想要鏈接異步操作時請記住它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM