libevent server服务端

70 阅读1分钟

代码

#include <event2/event.h>
#include <iostream>
#include <event2/listener.h>
#include <string.h>
#ifndef _WIN32
#include <signal.h>
#endif


#define SPORT 5001

void listen_cb(struct evconnlistener* e, evutil_socket_t s, struct sockaddr* addr, int socklen, void*arg)
{
    std::cout << "listen callback" << std::endl;
}

int main()
{
#ifdef _WIN32
    // windows socket库需要初始化
    WSADATA wver;
    WSAStartup(MAKEWORD(2, 2), &wver);
#else
    // 忽略管道信号,发送数据给已关闭的socket会导致程序down掉
    if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
    {
        return 1;
    }
#endif

    // 创建event上下文
    event_base* base = event_base_new();

    if (base)
    {
        std::cout << "event_base_new success!" << std::endl;
    }

    sockaddr_in sin;
    memset(&sin, 0, sizeof(sin));

    sin.sin_family = AF_INET;
    sin.sin_port = htons(SPORT);


    // 监听端口
    evconnlistener *ev = evconnlistener_new_bind(base, //  event上下文
        listen_cb,    // 回调函数
        base,         // 回调函数获取的参数
        LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,  // 地址重用|地址关闭同时关闭socket
        10,           // 连接队列大小,对应listen函数
        (sockaddr *)&sin,           // 绑定的地址和端口
        sizeof(sin)
        );

    if(base)
    // 事件分发处理
        event_base_dispatch(base);
    if(ev)
        evconnlistener_free(ev);

    if (base)
        event_base_free(base);

#ifdef _WIN32
    WSACleanup();
#endif


    return 0;
}

测试

image.png