当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/219602.html

相关文章:

  • 51单片机锅炉监控系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
  • zip文件解压缩命令全
  • 章鱼网络进展月报 | 2023.10.1-10.31
  • 数据结构 | 单链表专题【详解】
  • 前端基础之BOM和DOM
  • 第23期 | GPTSecurity周报
  • VSCode实用远程主机功能
  • 并发编程: 2. 线程管控
  • 使用 Python、XML 和 YAML 编写 ROS 2 Launch 文件
  • SpringCloud 微服务全栈体系(十)
  • [原创]Cadence17.4,win64系统,构建CIS库
  • Python 海龟绘图基础教学教案(一)
  • JUC并发编程系列(一):Java线程
  • 双向链表相关代码
  • [每周一更]-(第70期):常用的GIT操作命令
  • Leetcode-283 移动零
  • 爱上C语言:函数递归,青蛙跳台阶图文详解
  • Pycharm 对容器中的 Python 程序断点远程调试
  • 自动驾驶行业观察之2023上海车展-----车企发展趋势(3)
  • day55【动态规划子序列】392.判断子序列 115.不同的子序列
  • c语言中磁盘文件的分类
  • Unity适配微信
  • 虚拟机本地磁盘在线扩容
  • ACTIVE_MQ学习
  • 【C++初阶】类和对象(上)
  • 新版onenet平台安全鉴权的确定与使用
  • 容器核心技术-Namespace
  • linux写文件如何保证落盘?
  • 2023 electron最新最简版打包、自动升级详解
  • ConcurrentHashMap是如何实现线程安全的