记录下今天发现的一个问题
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被调用。