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,那么我无法完成这三个调用。