c++ libevent demo

简介: c++ libevent demo
Server::Server(const char *ip, int port)
{
  //创建事件集合
  base = event_base_new();
  struct sockaddr_in server_addr;
  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(port);
  server_addr.sin_addr.s_addr = inet_addr(ip);
  //创建监听对象
  listener = evconnlistener_new_bind(base, listener_cb, NULL, 
    LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, 10, (struct sockaddr *)&server_addr, 
      sizeof(server_addr));
  if (NULL == listener)
  {
    cout << "evconnlistener_new_bind error" << endl;
  }
  cout << "服务器初始化成功 开始监听客户端" << endl;
  event_base_dispatch(base);       //监听集合
}
//当有客户端发起连接的时候,会触发该函数
void Server::listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void *arg)
{
  cout << "接受客户端的连接,fd = " << fd << endl;
  //创建工作线程来处理该客户端
  thread client_thread(client_handler, fd);
  client_thread.detach();    //线程分离,当线程运行结束后,自动释放资源
}
void Server::client_handler(int fd)
{
  //创建集合
  struct event_base *base = event_base_new();
  //创建bufferevent对象
  struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
  if (NULL == bev)
  {
    cout << "bufferevent_socket_new error" << endl;
  }
  //给bufferevent设置回调函数
  bufferevent_setcb(bev, read_cb, NULL, event_cb, NULL);
  //使能回调函数
  bufferevent_enable(bev, EV_READ);
  event_base_dispatch(base);    //监听集合(监听客户端是否有数据发送过来)
  event_base_free(base);
  cout << "线程退出、释放集合" << endl;
}
void Server::read_cb(struct bufferevent *bev, void *ctx)
{
  char buf[1024] = {0};
  int size = bufferevent_read(bev, buf, sizeof(buf));
  if (size < 0)
  {
    cout << "bufferevent_read error" << endl;
  }
  cout << buf << endl;
  Json::Reader reader;       //解析json对象
  Json::FastWriter writer;   //封装json对象
  Json::Value val;
  if (!reader.parse(buf, val))    //把字符串转换成 json 对象
  {
    cout << "服务器解析数据失败" << endl;
  }
  string cmd = val["cmd"].asString();
  if (cmd == "register")   //注册功能
  {
    server_register(bev, val);  
  }
}
void Server::event_cb(struct bufferevent *bev, short what, void *ctx)
{
}
Server::~Server()
{
  event_base_free(base);
}
void Server::server_register(struct bufferevent *bev, Json::Value val)
{
}

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:

零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)

https://xxetb.xet.tech/s/3Zqhgt

相关文章
|
4月前
|
前端开发 编译器 程序员
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
|
6月前
|
网络协议 Linux API
c++网络库Libevent万字详解
libevent和libev都是c语言实现的异步事件库;通过注册异步事件,库检测事件触发,从而库根据发生事件的先后顺序,调用相应回调函数进行处理;事件包括:网络io事件,定时事件,信号事件;事件循环:等待并分发事件;用于管理事件;libevent 和 libev 主要封装了异步事件库与操作系统的交互;让用户不用关注平台的差异,只需着手事件的具体处理;创建事件处理框架event_base event_base_new()创建新事件event event_new()
201 0
|
JavaScript 前端开发 C++
JavaScript 调用 C++/Qt 工程(附有代码 + demo)
JavaScript 调用 C++/Qt 工程(附有代码 + demo)
|
机器学习/深度学习 Unix TensorFlow
opencv安装实录附十几行C++实现的一个人脸识别demo
opencv安装实录附十几行C++实现的一个人脸识别demo
349 0
opencv安装实录附十几行C++实现的一个人脸识别demo
|
安全 Go C语言
Go调用C/C++的小demo
go 调用 c/c++ 函数的实现方式有: - 直接嵌套在go文件中使用,最简单直观的 - 直接引用 c/c++ 文件的形式,层次分明,容易随时修改看结果的 - 导入动态库 .so 或 dll 的形式,最安全但是相对会比较慢的
701 0
|
C++
c++ demo 07 栈和堆 三维
c++ demo 07 栈和堆 三维
46 0
|
C++
c++ demo 04 栈和堆 二维
c++ demo 04 栈和堆 二维
42 0
|
C++
|
C++
c++ demo 05 类
c++ demo 05 类
77 0