// // Created by dongl on 23-4-8. // #include "MS.h" #include #include #include #include "event2/listener.h" ev_pool* MS::pool = nullptr; management* MS::mage = nullptr; MS::MS() { localEvPool(); if (!pool) { pool = new ev_pool(4); } pool->add_event_base(listener); pool->add_event_bases(4); pool->run(); mage = new class management(); } MS::~MS() { delete pool; delete mage; } void MS::listener() { event_base *base = event_base_new(); sockaddr_in sin = {0}; memset(&sin, 0, sizeof(sin)); sin = { AF_INET, htons(9999) }; evconnlistener *listener = evconnlistener_new_bind(base, MS::link, base, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_EXEC | LEV_OPT_DEFERRED_ACCEPT, 10, (sockaddr *) &sin, sizeof(sin) ); event_base_dispatch(base); evconnlistener_free(listener); event_base_free(base); } void MS::link(struct evconnlistener *e, int fd, struct sockaddr *addr, int socklen, void *arg) { if (!pool) { perror("en: Prohibit manual static invocation MS::safe_grab()\n"); return; } printf("listen_cb\n"); pool->add_buffer_event(fd, read_cb, write_cb, event_cb, BEV_OPT_CLOSE_ON_FREE, (sockaddr_in*)addr); fflush(stdout); } void MS::read_cb(struct bufferevent *bev, void *ctx) { BBCA* bbca = (BBCA*) ctx; auto addr = bbca->addr; auto base = bbca->base; printf("[read]: ip:%s, bev:%p, fd:%d, base:%p\n", inet_ntoa(addr->sin_addr), bev, bufferevent_getfd(bev), base); if (!mage) { mage = new class management(); } mage->read_packet(bev, (sockaddr_in*)ctx); fflush(stdout); } void MS::write_cb(struct bufferevent *bev, void *ctx) { BBCA* bbca = (BBCA*) ctx; auto addr = bbca->addr; auto base = bbca->base; printf("[write]: %p\n", base); fflush(stdout); } void MS::event_cb(struct bufferevent *bev, short what, void *ctx) { BBCA* bbca = (BBCA*) ctx; auto addr = bbca->addr; auto base = bbca->base; printf("[event]: %p\n", base); if (what == BEV_EVENT_EOF || BEV_EVENT_ERROR || BEV_EVENT_TIMEOUT) { printf("客户端退出\n"); handler::remove_user(bev); } fflush(stdout); } ev_pool *MS::localEvPool() { if (!pool) { pool = new ev_pool(5); } return pool; }