libevent 接口分析
libevent 简单示例
#include <iostream>
#include <event2/event.h>
#include <string.h>
#include <event2/listener.h>
#define SPORT 8080
#ifndef _WIN32
#include <signal.h> //使用 man signal 查找linux平台的头文件
#endif
void listen_cb(struct evconnlistener* e, evutil_socket_t s, struct sockaddr* a, int socklen, void* arg) {
std::cout << "listen_cb" << std::endl;
}
int main(int argc, char** argv) {
#if _WIN32
//windowns 初始化socket库
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
#else
//linux 忽略管道信号,发送数据给已关闭的socket
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
return 1;
#endif
event_base* base = event_base_new();
if (base) {
std::cout << "event_base_new init successfuly!" << std::endl;
}
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, // base上下文
listen_cb, // 接受连接的回调函数
base, // 回调函数获取的参数
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, // 地址重用,evconnlistener关闭同时关闭socket
10, // 连接队列大小,对应listen函数
(sockaddr*)&sin, // b绑定地址与端口
sizeof(sin)
);
// 事件分发处理
if (base) {
event_base_dispatch(base);
}
if (ev){
evconnlistener_free(ev);
}
if (base) {
event_base_free(base);
}
#ifdef _WIN32
WSACleanup();
#endif // _WIN32
return 0;
}
windows:使用visual studio2019
linux:Makefile
testlibevent:main.cpp
g++ $^ -o $@ -levent
./$@
clean:
rm -rf testlibevent
rm