コード例 #1
0
int main()
{
	SLOG_INIT("./config/slog.config");

	ListenSocket linsten_socket(3011);
	if(!linsten_socket.open())
	{
		SLOG_ERROR("listen on port:3010 error.");
		return -1;
	}

	DownloadServerThreadPool server_pool(5);
	server_pool.start();

	//listen event
	ListenHandler listen_handler(&server_pool);
	EpollDemuxer io_demuxer;
	io_demuxer.register_event(linsten_socket.get_handle(), EVENT_READ|EVENT_PERSIST, -1, &listen_handler);

	//timer event
	TimerHandler timer(&io_demuxer);
	io_demuxer.register_event(-1, EVENT_INVALID, 3000, &timer);

	//run server forever
	io_demuxer.run_loop();

	SLOG_UNINIT();
	return 0;
}
コード例 #2
0
static void
reactor_thread(void* arg)
{
    struct net_reactor* reactor = (struct net_reactor*)arg;

    while(reactor->thread == NULL || ox_thread_isrun(reactor->thread))
    {
        /*  由用户给定网络库每次循环的超时时间   */
        server_pool(reactor->server, SOCKET_POLL_TIME);
        ox_rwlist_flush(reactor->logic_msglist);

        reactor_proc_rwlist(reactor);
        reactor_proc_enterlist(reactor);

        {
            struct stack_s* waitsend_list = reactor->waitsend_list;
            char* data = NULL;
            while((data = ox_stack_popfront(waitsend_list)) != NULL)
            {
                struct net_session_s* session = *(struct net_session_s**)data;
                session->wait_flush = false;

                session_packet_flush(reactor, session);
            }
        }

        {
            struct stack_s* waitclose_list = reactor->waitclose_list;
            char* data = NULL;
            while((data = ox_stack_popfront(waitclose_list)) != NULL)
            {
                struct net_session_s* session = *(struct net_session_s**)data;
                /*  请求底层释放资源,并会触发释放完成    */
                server_close(reactor->server, session->handle);
            }

            /*  在处理了waitsend_list之后,使用专门的list来储存待关闭的session,以防reactor_proc_rwlist将session放入sendlist之后,然后free了session    */
        }
    }
}