부스트 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에서 실행을 호출하면이 세 번의 호출을 수행 할 수 없습니다.