我正在嘗試爲boost套接字實現ConnectWithTimeout函數。所以我使用了我發現的其中一個例子here。這在第一次嘗試中完美工作,但io_service.run_one()立即返回超時或取消錯誤。boost io_service不重置
這裏是我的代碼
using NetStatus = boost::system::error_code;
NetStatus handleWait(const NetStatus& error)
{
return boost::asio::error::timed_out;
}
NetStatus handleConnect(const NetStatus& error)
{
// The async_connect() function automatically opens the socket at the start
// of the asynchronous operation. If the socket is closed at this time then
// the timeout handler must have run first.
if (!m_socket.is_open())
return boost::asio::error::timed_out;
// Otherwise, a connection has been established. Update the timer state
// so that the timeout handler does not close the socket.
m_connectionTimeoutTimer.cancel();
return error;
}
void connectWithTimeout(boost::asio::ip::tcp::endpoint& endpoint, NetStatus& e)
{
// Stop last time's waiting objects
m_socket.cancel()
m_connectionTimeoutTimer.cancel();
m_ioService.stop();
m_ioService.reset();
// Set-up new objects to wait
m_connectionTimeoutTimer.expires_from_now(boost::posix_time::seconds(5));
m_connectionTimeoutTimer.async_wait([this, &e](const NetStatus& error) { e = handleWait(error); });
m_socket.async_connect(endpoint, [this, &e](const NetStatus& error) { e = handleConnect(error); });
// Block until one of them is done
m_ioService.run_one(e);
}
boost::asio::ip::tcp::socket m_socket;
boost::asio::deadline_timer m_connectionTimeoutTimer;
循環運行這個時,我看到的結果是: 超時(5秒後如預期) 取消(立即) 超時(立即) 取消(立即) 超時(立即) 取消(立即) 超時(立即) ...
誰能請幫助我們發現自己在做什麼wron G?
我不爲什麼已瞭解你打電話'm_ioService.stop();'和'm_ioService.reset();''裏面connectWithTimeout()'函數 –
我試圖讓io_service停止從前一次運行中彈出事件,所以我確保沒有以前的處理程序正在等待運行重置和停止。 –