C++ Boost.Asio截止时间计时器未按预期工作
我正在尝试在TCP套接字上实现Boost.Asio读取的超时 我正在尝试使用带有C++ Boost.Asio截止时间计时器未按预期工作,c++,boost,boost-asio,C++,Boost,Boost Asio,我正在尝试在TCP套接字上实现Boost.Asio读取的超时 我正在尝试使用带有截止时间计时器的async\u read\u some。下面我的函数是一个类的成员,该类持有指向TCP套接字和io\U服务的智能指针。当在不返回任何数据的活动套接字上调用时,我希望发生的是等待2秒并返回false 发生的情况是:如果套接字从未返回任何数据,它将按预期工作。然而,如果服务器返回数据,对下面方法的继续调用会立即返回,因为调用to timers回调时不会等待两秒钟 我试着注释掉async\u read\u
截止时间计时器的async\u read\u some
。下面我的函数是一个类的成员,该类持有指向TCP套接字和io\U服务的智能指针。当在不返回任何数据的活动套接字上调用时,我希望发生的是等待2秒并返回false
发生的情况是:如果套接字从未返回任何数据,它将按预期工作。然而,如果服务器返回数据,对下面方法的继续调用会立即返回,因为调用to timers回调时不会等待两秒钟
我试着注释掉async\u read\u some
调用,该函数总是按预期工作。为什么async\u read\u some
会改变计时器的工作方式
client::client() {
// Init socket and timer
pSock = boost::shared_ptr<tcp::socket > (new tcp::socket(io_service));
}
bool client::getData() {
// Reset io_service
io_service.reset();
// Init read timer
boost::asio::deadline_timer timer(pSock->io_service());
timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(boost::bind(&client::read_timeout, this, boost::system::error_code(), true));
// // Async read the data
pSock->async_read_some(boost::asio::buffer(buffer_),
boost::bind(&client::read_complete,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
// While io_service runs check read result
while (pSock->io_service().run_one()) {
if (m_read_result > 0) {
// Read success
return m_read_result;
}else if(m_read_result < 0){
return false;
}
}
}
}
void client::read_complete(const boost::system::error_code& error, size_t bytes_transferred) {
if (!error) {
m_read_result = bytes_transferred;
}else{
m_read_result = -1;
}
}
void client::read_timeout(const boost::system::error_code& error, bool timeout) {
if(!error){
m_read_result = -1;
}
}
client::client(){
//初始化套接字和计时器
pSock=boost::shared_ptr(新的tcp::socket(io_服务));
}
bool客户端::getData(){
//重置io_服务
io_service.reset();
//初始化读取计时器
boost::asio::deadline_timer(pSock->io_service());
timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(boost::bind(&client::read_timeout,this,boost::system::error_code(),true));
////异步读取数据
pSock->async_read_some(boost::asio::buffer(buffer_)),
boost::绑定(&C)客户端::读取完成,
这
boost::asio::占位符::错误,
boost::asio::占位符::已传输字节数
));
//io_服务运行检查读取结果时
while(pSock->io_service().运行_one()){
如果(m_读取结果>0){
//阅读成功
返回m_读取结果;
}否则如果(m_读取结果<0){
返回false;
}
}
}
}
无效客户端::读取完成(常量boost::系统::错误代码和错误,大小\u t字节\u传输){
如果(!错误){
m_read_result=传输的字节数;
}否则{
m_read_result=-1;
}
}
无效客户端::读取超时(常量boost::系统::错误代码和错误,bool超时){
如果(!错误){
m_read_result=-1;
}
}
当您检查连接错误时,您已经否定了条件
应该是:
if(error){
std::cout << "read_timeout Error - " << error.message() << std::endl;
}
if(错误){
std::cout设置计时器boost::system::error_code()时的简单问题应更改为_1或错误::占位符
timer.async_wait(boost::bind(&client::read_timeout, this, _1, true));
我确实检查了超时处理程序中的错误代码,它们总是被成功调用。我编辑了代码,同样的问题。直到我已经收到超时的过早触发之后,才开始构建截止时间计时器。你能提供完整的(如果最小的话就好了)吗源代码?很遗憾,我以前的回答是错误的。在出现错误时,将您在“读取完整”中设置的异步处理程序代码添加到传输的“字节”中,在没有错误时,将其添加到“字节”。这是正确的吗?抱歉,是您的代码建议我的。从“代码”!错误中删除!
。这是一个错误。a另一种情况是,当您收到任何数据时,您从函数返回,这会导致调用deadline_timer的析构函数,它应该调用callback,并出现错误“operation_aborted”。我认为这两种都不是错误,调用if(!error){//no error}或者{//error}是正确的,就是通过boost的例子来理解它。另外,我不会让函数调用函数中的函数,也不应该调用局部对象的解构器。