libevent eventbuffer 事件缓冲区的使用

c 复制代码
#include "watch.h"
#include <arpa/inet.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <event2/event.h>
#include <fcntl.h>
#include <stdint.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <zlog.h>

void read_cb(struct bufferevent *bev, void *arg) {
  size_t len = bufferevent_read(bev, arg, 1024);
  bufferevent_write(bev, arg, len);
}

void write_cb(struct bufferevent *bev, void *arg) { memset(arg, 0, 1024); }

void event_cb(struct bufferevent *bev, short events, void *arg) {
  if (events & BEV_EVENT_EOF) {
    printf("connection closed\n");
  } else if (events & BEV_EVENT_ERROR) {
    printf("some other error\n");
  }
  bufferevent_free(bev);
}

void on_connect(struct evconnlistener *listener, evutil_socket_t sock,
                struct sockaddr *addr, int len, void *ptr) {
  static char buffer[1024];
  printf("new client online: %s \n",
         inet_ntoa(((struct sockaddr_in *)addr)->sin_addr));
  struct event_base *base = (struct event_base *)ptr;
  struct bufferevent *bev;
  bev = bufferevent_socket_new(base, sock, BEV_OPT_CLOSE_ON_FREE);
  bufferevent_setcb(bev, read_cb, write_cb, event_cb, buffer);
  bufferevent_enable(bev, EV_READ);
}

int main(void) {
  struct watch watcher = {.log_conf = "./zlog.conf"};
  watcher.loop = event_base_new();
  struct sockaddr_in addr;
  addr.sin_family = AF_INET;
  bzero(addr.sin_zero, sizeof(addr.sin_zero));
  addr.sin_addr.s_addr = inet_addr("0.0.0.0");
  addr.sin_port = htons(4080);
  struct evconnlistener *listener = evconnlistener_new_bind(
      watcher.loop, on_connect, watcher.loop,
      LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE_PORT, 255,
      (const struct sockaddr *)&addr, sizeof(addr));
  return event_base_loop(watcher.loop, 0);
}

libevent 效果非常不错,维护255个链接毫无压力
Linux 嵌入式开发 libevent + libev 必须得掌握,少走弯路,而其,这种设计思路适用于,工作时间一长发现,在嵌入式这块儿的软件开发,可以解决,很多痛点,不局限于网络开发,驱动的参数调优检测,其实也完全适用, 源码的观看,要比内核天书还是容易些的
最近感觉有点迷茫,又感觉自己啥都不会了 ... ... 心情极度郁闷 ... ...

RUST C++ 熟练度达不到 C 和 PYTHON LUA BASH 的程度

常规算法又不想刷题,但是还有好多不会 ... ... ...

内核的驱动框架中的各个子系统又不想深入弄了,郁闷... ...

网络协议栈的深入理解和调试方法,也不想在深入弄了,更郁闷... ...

他娘的,总之感觉无穷无尽
FSBL UBOOT 没啥可弄的,除非有其他的定制需求

hardware i2c spi usb can mdio pwm libmeta ethernet dsa (多核心通信调用计算) -> BSP 和 linux driver framework

yocto,buildroot

ptp 协议栈还得深耕,包括算法和芯片驱动 (好多 ... ...)

时钟芯片的原理和配置方法 (好多 ... ...)

射频芯片的架构和基础原理和参数调优(好多 ... ...)

射频系统的参数调优和基础原理(好多... ...)

现有运营商,需要的射频各种解决方案 (好多 ... ...)

C(RUST) 做底层开发(又linux 系统 的底层),单片机(RUST 完全没必要) libevent libuv

C++ 做次底层开发 (network) [NETCONFIG] 有现成的库 和框架,机制健全 (网络应用TCP,UDP)

LUA 做热补丁调用(拓展LUA 插件方便容易,和自定应Lua 解释器)

PYTHON 软件调试|(QT C++)(QT PY) | 算法模拟 TREE LIST STACK HEAP QUEUE 小规模并发处理 | 数据可视化

后来发现基于(树结构的各种排序算法),可优化,事件的调度, 这个还得学,还得会证明

射频的参数调优和测试, 基础理论还得恶补一些

数字电路还得在刷一些bilibili 的视频

... ...

... ...

唉,底层软件开发完全是调度计算工具和参数自动调优的工具 ... ...

妈的,学习的事儿放一放,明年这个时候,我要有4块腹肌 ... ... , 今天先吃顿大的

相关推荐
敲上瘾38 分钟前
动静态库的制作与使用(Linux操作系统)
linux·运维·服务器·c++·系统架构·库文件·动静态库
bohu835 小时前
亚博microros小车-原生ubuntu支持系列:8-脸部检测与人脸特效
linux·opencv·ubuntu·dlib·microros·亚博
小池先生8 小时前
grafana+prometheus监控linux指标
linux·grafana·prometheus
浮梦终焉8 小时前
【嵌入式】总结——Linux驱动开发(三)
linux·驱动开发·qt·嵌入式
远方 hi8 小时前
linux如何修改密码,要在CentOS 7系统中修改密码
linux·运维·服务器
练小杰9 小时前
Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
linux·c语言·c++·经验分享·qt·学习·编辑器
mcupro11 小时前
提供一种刷新X410内部EMMC存储器的方法
linux·运维·服务器
不知 不知11 小时前
最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机
linux·运维·服务器·centos
BUG 40411 小时前
Linux--运维
linux·运维·服务器
千航@abc11 小时前
vim在末行模式下的删除功能
linux·编辑器·vim