boost deadline_timer не стартует - PullRequest
       34

boost deadline_timer не стартует

0 голосов
/ 07 августа 2011

Мы написали однопоточный клиент на основе boost asio. Клиенту необходимо реализовать тайм-аут, чтобы соединение было разорвано, если чтение или запись с сервера не были завершены в оговоренный период времени. Но async_wait для deadline_timer не запускается до тех пор, пока я не вызову run для io_service. Теперь, если я вызову команду run на io_service, мое чтение и запись на сервер невозможны.

Пожалуйста, смотрите выдержки из моего текущего кода:

  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
                                                    )
                                       );
    }
 }

Мне нужно подключиться, написать на сервер, а затем получить ответ от сервера, и для каждой операции мне нужно время ожидания для начала. Если я вызываю команду run из io_service, я не могу выполнить эти три вызова.

1 Ответ

1 голос
/ 08 августа 2011

Мне нужно подключиться, написать на сервер и затем получить ответ от сервер и для каждой операции мне нужно время ожидания для начала. Если я позвоню запустить из io_service, то я не могу сделать эти три вызова.

При использовании deadline_timer::async_wait() вам нужно будет использовать соответствующие методы асинхронного сокета, такие как socket::async_connect() вместо socket::connect().

...