[英]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.