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; }
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 */ } } }