libevent使用

发布时间 2023-06-10 22:00:08作者: 君凌烟阁
// 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: