2011-08-07 7 views
0

부스트 asio를 기반으로 한 단일 스레드 클라이언트를 작성했습니다. 클라이언트는 제한 시간을 구현해야하기 때문에 서버에서 읽기 또는 쓰기가 지정된 시간 내에 완료되지 않으면 연결이 끊어집니다. 하지만 deadline_timer에 대한 async_wait는 io_service를 실행하지 않을 때까지 시작되지 않습니다. 이제 io_service에서 실행을 호출하면 서버 읽기 및 쓰기가 불가능합니다.부스트 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에서 실행을 호출하면이 세 번의 호출을 수행 할 수 없습니다.

답변

1

서버에 연결하고 서버에서 응답을 받아야하며 각 작업에 대해 킥오프 시간이 필요합니다. 을 io_service에서 실행하면이 세 번의 호출을 수행 할 수 없습니다.

하면 같은 socket::async_connect() 대신 socket::connect()으로 대응하는 비동기 소켓 방법을 사용해야합니다 deadline_timer::async_wait()를 사용하는 경우.

관련 문제