0
点赞
收藏
分享

微信扫一扫

libevent eventbuffer 事件缓冲区的使用

栖桐 2023-08-13 阅读 53
linux
#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);
}

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

举报

相关推荐

0 条评论