Example #1
0
		// 工作线程
		void work()
		{
			boost::asio::io_service ios;
			boost::asio::deadline_timer c( ios, boost::posix_time::seconds(1) );
			c.async_wait( boost::bind( &listener::check_interrupt, boost::ref(c) ) );
			boost::asio::ip::tcp::socket* p=new boost::asio::ip::tcp::socket(ios);
			_acceptor.async_accept( *p, 
				boost::bind(&listener::handle_accept, this, p, boost::asio::placeholders::error)
				);

			io_service_work(ios);
		}
Example #2
0
    void AsioServiceRunner::ServiceThreadProc()
    {
        LOG4CPLUS_TRACE_METHOD(Loggers::Service(), "AsioServiceRunner::ServiceThreadProc()");
        LOG4CPLUS_INFO(Loggers::Service(), "Thread "<<service_name_<<" started.");

        assert(io_service_);

        while(true)
        {
            try
            {
                boost::asio::io_service::work io_service_work(*io_service_);
                io_service_->run();
                break;
            }
            catch(...)
            {
                LOG4CPLUS_ERROR(Loggers::Service(), "An error occurred in "<<service_name_<<" thread. Will retry shortly.");
                io_service_->reset();
            }
        }
    }
Example #3
0
		/// <summary>开始监听端口</summary>
		/// <remarks>
		///   本函数会创建 thread_count+1 个线程,一个线程用来监听和接受连接,其他线程处理
		///   网络 IO 操作,所有线程的 io_service 都独立,因此可以保证 IO 的回调都是非并行的。
		/// </remarks>
		void run( const uint16_t port, int thread_count=1, bool hold=false )
		{
			boost::asio::ip::tcp::endpoint _endpoint=asio::ip::tcp::endpoint( asio::ip::tcp::v4(), port );

			_acceptor.open( _endpoint.protocol() );
			_acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));	// 允许绑定到同一个端口
			_acceptor.bind( _endpoint );
			_acceptor.listen( 32 ); // Maybe throw

			if( thread_count>0 ){
				for( int i=0; i<thread_count; ++i )
					_threads.create_thread(boost::bind(&listener::work, this ));
			}else{
				boost::asio::ip::tcp::socket *p=new boost::asio::ip::tcp::socket(_io_service_acceptor);
				_acceptor.async_accept( *p, 
					boost::bind(&listener::handle_accept, this, p, boost::asio::placeholders::error)
					);
			}
			if( hold )
				io_service_work( _io_service_acceptor );
			else
				_threads.create_thread( boost::bind(&listener::io_service_work, this, boost::ref(_io_service_acceptor) ) );
		}