libevent_2:写一个demo先

以下代码通过libevnet的默认配置,创建了一个监听程序,当有客户端连接时,就会触发事件响应回调函数 。 可以通过 telnet ip 5001 来测试。 程序同时兼容linux、windows。
git地址: http://121.4.70.4:3000/adminPyf/libevent_study.git
libevent_study/test_libevent

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


#define SPORT 5001

void listen_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *arg) {
    std::cout << "listen to be" << std::endl;
}

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

    //创建libevent上下文
    event_base* base = event_base_new();
    if (base) {
        std::cout << "test server" << "\n";
    }


    sockaddr_in sin;
    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SPORT);

    //socket,bind listen  绑定事件
    evconnlistener * ev = evconnlistener_new_bind(base, //libevent上下文
        listen_cb, //接收到连接的回调函数
        base, //回调函数获取的参数(根据业务来)
        LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, //地址重用,evconnlistener关闭同时关闭socket
        10,  //连接队列大小,对应listen函数参数
        (sockaddr*)&sin,//绑定的地址和端口
        sizeof(sin)
    );

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

#if _WIN32
    WSACleanup();
#endif // _WIN32

    return 0;
}

libevent_2:写一个demo先

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动到顶部