// testlibevent.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "event2/event.h" #include "event2/listener.h" #include "event2/thread.h" #include <event2/listener.h> #include <iostream> void listen_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *) { printf("lister...\n"); } int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa); event_config *cfg = event_config_new(); //设置IOCP,不然windows默认用的是select event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP); //初始化线程 evthread_use_windows_threads(); SYSTEM_INFO si; GetSystemInfo(&si); event_config_set_num_cpus_hint(cfg, si.dwNumberOfProcessors); event_base* base = event_base_new_with_config(cfg); event_config_free(cfg); if (base) { std::cout << "Hello World!\n"; sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(1993); auto *ev = evconnlistener_new_bind(base, listen_cb, base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, //地址重用,listen关闭,关闭socket 10, (sockaddr*)&sin, sizeof(sin) ); event_base_dispatch(base); evconnlistener_free(ev); } if (base) { event_base_free(base); } system("pause"); }
此文是windows下libevent的调用。
event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP);
这一行表示调用IOCP,否则默认是调用select。
event_base* base = event_base_new_with_config(cfg); 则是生成一个支持IOCP的示例,否则可以用默认的函数 event_base_new();
evconnlistener_new_bind 表示listener,bind,(accept?)
listen_cb 是当什么时候触发?
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE 分别表示 地址重用;关闭event 会自动关闭socket。
event_base_dispatch: