void cia_client::do_timeout_check()
{
	if (m_started_)
	{
		m_check_timeout_timer.expires_from_now(boost::posix_time::milliseconds(TIMEOUT_CHECK_ELAPSED));
		ptr self = shared_from_this();
		//BOOST_LOG_SEV(cia_g_logger, AllEvent) << "开始准备异步检测超时, 触发检测的时间是在"
		//	<< TIMEOUT_CHECK_ELAPSED << "毫秒后, " << "客户端socket超时时间设置为" << m_timeout_elapsed << "毫秒";
		m_check_timeout_timer.async_wait([this, self](const error_code& ec){
			if (ec)
			{
				BOOST_LOG_SEV(cia_g_logger, Debug) << "已停止超时检测";
				stop();
				return;
			}
			std::size_t elapsed_time_ = std::size_t(m_update_time.elapsed().wall / 1000000);
			if (elapsed_time_ > m_timeout_elapsed) {
				BOOST_LOG_SEV(cia_g_logger, Debug) << "客户端因超时关闭, 已经在"
					<< elapsed_time_ << "毫秒内无任何动作";
				stop();
			}
			else if (elapsed_time_ > m_timeout_elapsed / 2) {
				BOOST_LOG_SEV(cia_g_logger, AllEvent) << "向客户端发送心跳请求, 已经在"
					<< elapsed_time_ << "毫秒内无任何动作";
				do_deal_heart_request();
			}
			do_timeout_check();
		});
	}
}
예제 #2
0
void on_timer_good(deadline_timer& t, push_service& ps)
{
    static uint32_t count = 10000;

    device dev1(apns::key, base64_decode("9pfzxPgLrG/8DM8zYXcwUEId2lH0G8dq+jlkh72HXMQ="));
    apns_message msg;

    msg.alert = "Valid";
    msg.badge = 3;
    msg.sound = "chime";

    msg.action_loc_key = "test";
    msg.loc_key = "test2";
    msg.loc_args.push_back("test12");
    msg.loc_args.push_back("test23");

    msg.launch_image = "test.png";
    msg.add("custom-test", "hello world"); // custom key-value

//    ps.post(dev1, msg, 1, count++);


    // reset timer
    t.expires_from_now(posix_time::millisec(1));
    t.async_wait(boost::bind(&on_timer_good, boost::ref(t), boost::ref(ps)));
}
예제 #3
0
void check_deadline(deadline_timer& deadline, udp::socket& socket) {
  if (deadline.expires_at() <= deadline_timer::traits_type::now()) {
    socket.cancel();
    deadline.expires_at(boost::posix_time::pos_infin);
  }
  deadline.async_wait(boost::bind(&check_deadline, boost::ref(deadline), boost::ref(socket)));
}
예제 #4
0
void print_stats(deadline_timer& stats_timer, error_code const& ec)
{
	if (ec) return;

	time_point now = steady_clock::now();
	float interval = duration_cast<milliseconds>(now - stats_start).count() / 1000.f;
	if (interval <= 0.f) interval = 0.001f;
	stats_start = now;

	printf(
#ifdef DEBUG_STATS
		"ping-queue: %" PRId64 "m"
		" node-buf: [%dk %dk %dk %dk]"
#endif

		" in: %.1f"
		" invalid_enc: %.1f"
		" invalid_src: %.1f"
		" id_failure: %.1f"
		" out_ping: %.1f"
		" short_tid_pong: %.1f"
		" invalid_pong: %.1f"
		" added: %.1f\n"
#ifdef DEBUG_STATS
		, queue_time.load()
		, nodebuf_size[0].load() / 1000
		, nodebuf_size[1].load() / 1000
		, nodebuf_size[2].load() / 1000
		, nodebuf_size[3].load() / 1000
#endif
		, incoming_queries.exchange(0) / interval
		, invalid_encoding.exchange(0) / interval
		, invalid_src_address.exchange(0) / interval
		, failed_nodeid_queries.exchange(0) / interval
		, outgoing_pings.exchange(0) / interval
		, short_tid_pongs.exchange(0) / interval
		, invalid_pongs.exchange(0) / interval
		, added_nodes.exchange(0) / interval
		);

#ifdef CLIENTS_STAT
	std::lock_guard<std::mutex> l(client_mutex);
	std::vector<std::pair<int, uint16_t>> ordered;
	for (auto i : client_histogram) {
		ordered.emplace_back(i.second, i.first);
	}
	std::sort(ordered.begin(), ordered.end());
	for (auto i : ordered) {
		printf("[%c%c: %d] ", (i.second >> 8) & 0xff, i.second & 0xff, i.first);
	}
	printf("\n");
	client_histogram.clear();
#endif

	fflush(stdout);

	stats_timer.expires_from_now(boost::posix_time::seconds(print_stats_interval));
	stats_timer.async_wait(std::bind(&print_stats, std::ref(stats_timer), _1));
}
예제 #5
0
void on_timer_bad(deadline_timer& t, push_service& ps)
{
    static uint32_t count = 1;

    device dev1(apns::key, base64_decode("9pfzxPgLrG/8DM8zYXcwUEId2lH0G8dq+jlkh72HXMQ="));
    //  ps.post(dev1, "", 1, count++);

    // reset timer
    t.expires_from_now(posix_time::millisec(10));
    t.async_wait(boost::bind(&on_timer_bad, boost::ref(t), boost::ref(ps)));
}
예제 #6
0
        void
        send_packet ()
        {
          // 2 seconds should be a good time to wait for a response.
          retry_timer.expires_from_now(boost::posix_time::seconds(2));
          retry_timer.async_wait(boost::bind(&resolve::resend_timeout, this));

          // send out the packets for request
          for( vector< ip::udp::endpoint >::iterator iter = endpointList.begin(); iter != endpointList.end(); ++iter )
            socket.send_to(boost::asio::buffer(reqBuffer.get_array()), *iter);
        }
예제 #7
0
        void
        request_timeout ()
        {
          retry_timer.cancel();
          death_timer.cancel();

          // just tear everything down at this point.
          if( socket.is_open() )
            socket.close();

          if( requestCount.dec() == 0 )
            ioservice.stop();
        }
예제 #8
0
        /**
         @param qmessage Query message to send to the server list
         @return Query result. If the query failed or timed out, dns::message.result() will return no_result.
         */
        dns::message &
        query ( dns::message & qmessage )
        {
          // set a few defaults for a message
          qmessage.recursive(true);
          qmessage.action(dns::message::query);
          qmessage.opcode(dns::message::squery);

          // make our message id unique
          qmessage.id(0xaffe);

          qmessage.encode(reqBuffer);

          // in the event nothing get's resolved, answer with the original question
          responseMessage = qmessage;
          responseMessage.result(dns::message::no_result);

          // die if we don't get a response within death_timeout
          death_timer.expires_from_now(boost::posix_time::seconds(death_timeout));
          death_timer.async_wait(boost::bind(&resolve::request_timeout, this));

          for( vector< ip::udp::endpoint >::iterator iter = endpointList.begin(); iter != endpointList.end(); ++iter )
          {
            // we're waiting for N of requests
            requestCount.inc();

            // setup the receive buffer
            shared_dns_buffer_t recvBuffer(new dns_buffer_t);
            socket.async_receive_from(boost::asio::buffer(recvBuffer.get()->get_array()), *iter, boost::bind(
                &resolve::handle_recv,
                this,
                recvBuffer,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
          }

          // kick off the request
          send_packet();

          // run a blocking service
          ioservice.run();

          return responseMessage;
        }
예제 #9
0
void on_gcm_timer_good(deadline_timer& t, gcm& google)
{
    static uint32_t count = 10000;

    device dev(gcm::key, "APA91bGKcd_PZQ9eYqo4INvuCdqFX96xnSS6B12i66H0"
               "-6Mj3OJf57YUmEStuahZjYjroFsd4wR31n45bknh2xGjM0BftQ8zccLVF3"
               "GhwwAO8MMd4ldq_TO0LwmAwSvhczig74j0s_ABzZKWHFtkQKzHkALshScbhg");

    gcm_message msg(count++);
    msg.dry_run = true;
    msg.time_to_live = 1234;

    msg.add("custom", boost::lexical_cast<std::string>(count) );

    google.post(dev, msg, 0);

    // reset timer
    t.expires_from_now(posix_time::millisec(1));
    t.async_wait(boost::bind(&on_gcm_timer_good, boost::ref(t), boost::ref(google)));
}
예제 #10
0
    bool pool_timer::stop_locked()
    {
        if (!is_terminated_ && is_started_ && !is_stopped_) {
            is_started_ = false;
            is_stopped_ = true;

            HPX_ASSERT(timer_ != nullptr);
            timer_->cancel();
            return true;
        }
        return false;
    }
예제 #11
0
        void
        resend_timeout ()
        {
          retry_timer.cancel();

          // No response, so resend the message again
          if( socket.is_open() )
            send_packet();
          else
            // if the socket gets closed, then, we've probably received an answer!
            request_timeout();
        }
예제 #12
0
    bool pool_timer::start(util::steady_duration const& time_duration,
        bool evaluate_)
    {
        std::unique_lock<mutex_type> l(mtx_);
        if (is_terminated_)
            return false;

        if (!is_started_) {
            if (first_start_) {
                first_start_ = false;

                util::unlock_guard<std::unique_lock<mutex_type> > ul(l);
                if (pre_shutdown_)
                {
                    register_pre_shutdown_function(
                        util::bind(&pool_timer::terminate,
                            this->shared_from_this()));
                }
                else
                {
                    register_shutdown_function(
                        util::bind(&pool_timer::terminate,
                            this->shared_from_this()));
                }
            }

            is_stopped_ = false;
            is_started_ = true;

            HPX_ASSERT(timer_ != nullptr);
            timer_->expires_from_now(time_duration.value());
            timer_->async_wait(util::bind(&pool_timer::timer_handler,
                this->shared_from_this(), util::placeholders::_1));

            return true;
        }
        return false;
    }