Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost.Asio截止时间计时器未按预期工作_C++_Boost_Boost Asio - Fatal编程技术网

C++ 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

我正在尝试在TCP套接字上实现Boost.Asio读取的超时

我正在尝试使用带有
截止时间计时器的
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的例子来理解它。另外,我不会让函数调用函数中的函数,也不应该调用局部对象的解构器。