以下代码通过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先