代码是:
初始化对象:
tcp_client tcp_client_obj(*this,io_service,tcp_peer_context, ip_, port_, "", datas, ret, stdout_msgs, stderr_msgs,peer_check_flag_,deploy_type_);
io_service.run();
成员函数:
void tcp_client::handle_total_timeout(const boost::system::error_code& error_)
{
if (error_ != boost::asio::error::operation_aborted)
{
stderr_msgs.push_back("proxy total timeout");
ret = MESSAGE_ERROR_CLIENT_TOTAL_TIMEOUT;
close();
}
}
void tcp_client::start()
{
boost::asio::ip::tcp::resolver resolver(socket.get_io_service());
string temp = boost::lexical_cast<string>(port);
boost::asio::ip::tcp::resolver::query query(ip.c_str(), temp.c_str());
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
total_timer.expires_from_now(boost::posix_time::seconds(total_timeout));
total_timer.async_wait(boost::bind(&tcp_client::handle_total_timeout, this, boost::asio::placeholders::error));
connect_timer.expires_from_now(boost::posix_time::seconds(connect_timeout));
connect_timer.async_wait(boost::bind(&tcp_client::handle_connect_timeout, this, boost::asio::placeholders::error));
now_time = global::currenttime::getms();
boost::asio::async_connect(socket.lowest_layer(), iterator, boost::bind(&tcp_client::handle_connect, this,boost::asio::placeholders::error));
LDeployInfo(str(format("[TCP Client] Connecting server@%s:%d") % ip % port));
}
我想测试handle_total_time()的功能。所以我添加了代码
bool tcp_client::check_release_md5()
{
while()
{
//just test this.
}
/*
* do somethings.
*/
}
check_release_md5将在start()函数之后调用。
为什么handle_total_timeout()无法正常工作?
实际上,check_release_md5将永远运行。
答案 0 :(得分:2)
编辑: 亲爱的来自未来的人们: 事实证明,问题是被调用的第一个处理程序从未返回。因此,io_service无法发布()第二个,这将取消第一个。
首先让我说出我的个人观点:以某种方式标记成员变量。
你是否保证io_service.run()在你到达时仍在运行?更确切地说,你可以在构造之后但在调用start()之前调用io_service.run()吗?
在那种情况下,io_service已经返回,并且不会处理任何内容。还有另外一种可能性:io_service可能在代码的某个早期点运行()并且你忘了重置()它吗?