/***
* @projectName libevent_test_server
* @brief 功能介绍:测试使用libevent创建服务器,并且能够正常接收到socket连接回调
* @param 参数说明
* @return 返回值说明
* @note 使用注意事项
*/
#include <iostream>
#include <event2/event.h>
#include <event2/listener.h>
using namespace std;
#define SPORT 5001
void listen_cb(struct evconnlistener *e, evutil_socket_t s, struct sockaddr *a, int socklen, void *arg)
{
cout << "listen_cb" << endl;
}
int main()
{
#ifdef _WIN32
//初始化socket库,在做windows socket函数的时候需要初始化
WSADATA wver;
WSAStartup(MAKEWORD(2, 2), &wver);
#else
//忽略关掉信号,发送数据给已关闭的socket,避免程序crash
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
return 1;
#endif //
std::cout << "test libevent!\n";
//创建libevent的上下文
event_base* base = event_base_new();
if (base)
{
std::cout << "event_base_new success!" << std::endl;
}
//监听端口
//socket创建,bind连接,listen监听
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, //LEV_OPT_REUSEABLE - 地址重用;LEV_OPT_CLOSE_ON_FREE - listen关闭同时关闭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 // _WIN32
return 0;
}
测试使用libevent创建服务器,并且能够正常接收到socket连接回调
最新推荐文章于 2024-05-17 17:50:09 发布