2011-08-07 38 views
0

我们已经编写了一个基于boost asio的单线程客户端。客户端需要实现超时,以便在规定的时间内未完成从服务器的读取或写入时连接中断。但deadline_timer的async_wait不会启动,直到我不调用io_service的运行。现在,如果我在io_service上调用run,那么我不能读写服务器。boost deadline_timer没有启动

请参阅摘录我当前的代码:

typedef boost::scoped_ptr<boost::asio::ip::tcp::socket> SocketPtr; 
    typedef boost::shared_ptr<boost::asio::deadline_timer> DLTPtr; 

    SocketPtr m_SocketPtrClient; 
    DLPtr m_ClientTimeoutDLTPtr; 

    boost::asio::io_service ios; 
    m_SocketPtrClient.reset(new boost::asio::ip::tcp::socket(ios)); 

    m_ClientTimeoutDLTPtr.reset(new deadline_timer(ios)); 

    m_ClientTimeoutDLTPtr->expires_from_now(boost::posix_time::seconds(m_uiCommTimeout)); 
    m_ClientTimeoutDLTPtr->async_wait(boost::bind(&MyClass::clientTimeoutHandler, 
                 this, 
                 boost::asio::placeholders::error 
                ) 
             ); 

    m_SocketPtrClient->connect 
    (
     boost::asio::ip::tcp::endpoint 
     (
      boost::asio::ip::address::from_string 
      (
       m_sCommAddress == "localhost" ? "127.0.0.1" : m_sCommAddress 
      ), m_usCommPort 
     ), ec 
    ); 

    if(!ec && m_SocketPtrClient->is_open()) 
    { 
     m_ClientTimeoutDLTPtr->cancel(); 
    } 
    else 
    { 
     m_ClientTimeoutDLTPtr->cancel(); 
     m_SocketPtrClient->close(); 
     return eStateError; 
    } 

    //install a timeout handler 
    m_ClientTimeoutDLTPtr->expires_from_now(boost::posix_time::seconds(m_uiCommTimeout)); 
    m_ClientTimeoutDLTPtr->async_wait(boost::bind(&MyClass::clientTimeoutHandler, 
                 this, 
                 boost::asio::placeholders::error 
                ) 
             ); 

    ec = writeToServer(*m_SocketPtrClient); 
    if(ec) 
    { 
     // do error handling and throw an exception 
    } 
    m_ClientTimeoutDLTPtr->cancel(); 

    //install a timeout handler 
    m_ClientTimeoutDLTPtr->expires_from_now(boost::posix_time::seconds(m_uiCommTimeout)); 
    m_ClientTimeoutDLTPtr->async_wait(boost::bind(&MyClass::clientTimeoutHandler, 
                 this, 
                 boost::asio::placeholders::error 
                ) 
             ); 
    ec = readFromServer(*m_SocketPtrClient); 
    if(ec) 
    { 
     // do error handling and throw an exception 
    } 
    m_ClientTimeoutDLTPtr->cancel(); 


    void MyClass::clientTimeoutHandler(const boost::system::error_code& ec) 
    { 
    if(ec) 
    { 
     m_ClientTimeoutDLTPtr->cancel(); 
     m_SocketPtrClient->close(); 

     m_ssMsg << std::endl << "break all handling because of timeout on io_service of Client!"; 
    } 
    else 
    { 
     m_ClientTimeoutDLTPtr->expires_from_now(boost::posix_time::seconds(m_uiCommTimeout)); 
     m_ClientTimeoutDLTPtr->async_wait(boost::bind(&MyClass::clientTimeoutHandler, 
                 this, 
                 boost::asio::placeholders::error 
                ) 
             ); 
    } 
} 

我需要连接,写入到服务器,然后从服务器获取和我需要超时开球每个操作的响应。如果我从io_service调用run,那么我无法完成这三个调用。

回答

1

我需要连接,写入服务器,然后从 服务器获得响应,对于每个操作,我需要超时启动。如果我打电话给 从io_service运行,那么我不能让我的这三个电话。

当使用deadline_timer::async_wait()您将需要使用相应的异步套接字方法,如socket::async_connect(),而不是socket::connect()