boost::asio::socket::async_read_some
阿新 • • 發佈:2019-01-01
記錄下今天發現的一個問題
void CBoostSocket::connect_hander(const boost::system::error_code& err){
if (err)
{
return;
}
vector<char>* buf = new vector<char>(100,0);
m_Sock.async_read_some(buffer(*buf),boost::bind(&CBoostSocket::read_hander,this,buf,placeholders::error));//註冊非同步讀取事件
}
void CBoostSocket::read_hander(vector<char>* buf,const boost::system::error_code& err )
{
if (err)
{
return;
}
if (!buf->empty())
{
cout<<&(*buf)[0]<<endl;
}
buf->clear(); //會釋放vector佔有的記憶體
m_Sock.async_read_some(buffer(*buf),boost::bind(&CBoostSocket::read_hander,this,buf,placeholders::error));//傳入了記憶體空間為0的緩衝
}
上面是寫了一個客戶端,connect之後就開始非同步接收工作,但是程式執行之後read_hander就一直被呼叫,成了一個死迴圈。本來async_read_some這樣的函式就是往IOCP的佇列裡面添加了一個非同步任務,沒有事情的時候read_hander不應該被呼叫。
經過反覆除錯發現問題是出在了buf->clear()這塊了,因為clear之後vector的記憶體被清除,所以所有後面用async_read_some的非同步讀取任務都立即完成,read_hander被呼叫。