环境配置:建立标准的开发环境目录,将所需的库,头文件等,放到对应的文件夹下,将项目放置到src目录下
选择项目属性配置:配置四个地方
#include <event2/event.h>
#include <event2/listener.h>
#include <iostream>
#include <string.h>
using namespace std;
#define SPORT 8080
#ifdef _WIN32
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libevent.lib")
#else
#include <signal.h>
#endif
void listen_cb(struct evconnlistener* e, evutil_socket_t s, struct sockaddr* a, int socklen, void* arg)
{
cout << "event listen_cb!" << endl;
}
int main()
{
#ifdef _WIN32
//初始化socket库
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
#else
//忽略管道信号,发送数据给已经关闭的socket
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
return -1;
#endif
std::cout << "test server!\n";
//创建libevent的上下文
event_base* base = event_base_new();
if (base)
{
cout << "event_base_new success!" << 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, //libevent的上下文
listen_cb, //接受到连接的回调函数
base, //回调函数获取的参数 arg
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);
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}