libevent学习.1

原创 2017年01月03日 04:46:06

版本: 2.0.22

ECHO服务器(单线程异步例子)

#include <stdlib.h>
#include <string> // C++
#include <string.h> // C
#include <unistd.h>
#include <event.h>
#include <evutil.h>
#include <event2/listener.h>

void cb_read(struct bufferevent *bev, void *ctx) {
    evbuffer *input, *output;
    input = bufferevent_get_input(bev);
    output = bufferevent_get_output(bev);

    char *str = evbuffer_readln(input, NULL, EVBUFFER_EOL_CRLF);
    if (str == NULL) {
        return;
    }

    if (strcmp(str, "bye") == 0) {
        bufferevent_free(bev);
    } else if (strcmp(str, "exit") == 0) {
        event_base *base = bufferevent_get_base(bev);

        // memory leak (had pending bufferevent)
        event_base_loopexit(base, NULL);
    } else {
        std::string s(str);

        s.insert(0, "resp: ");
        s.append("\n");
        bufferevent_write(bev, s.data(), s.size());
    }
    free(str);
}

void cb_write(struct bufferevent *bev, void *ctx) {

}

void cb_error(struct bufferevent *bev, short what, void *ctx) {

    bufferevent_free(bev);
}

void cb_accept(evconnlistener *lev, evutil_socket_t fd, sockaddr *sa, int socklen, void *ctx) {
    event_base *base = evconnlistener_get_base(lev);

    bufferevent *bufev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    bufferevent_setcb(bufev, cb_read, cb_write, cb_error, NULL);
    bufferevent_enable(bufev, EV_PERSIST|EV_READ|EV_WRITE);
}

void cb_accept_error(evconnlistener *lev, void *ctx) {
    event_base *base = evconnlistener_get_base(lev);

    event_base_loopexit(base, NULL);
}

int do_server(u_short port) {
    event_base *base = event_base_new();
    if (base == NULL) {
        return -1;
    }

    sockaddr_in sa;
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = htonl(0);
    sa.sin_port = htons(port);

    evconnlistener *lev = evconnlistener_new_bind(base, cb_accept, NULL, 
        LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1/*BACKLOG*/,
        (sockaddr *)&sa, sizeof(sa));
    if (lev == NULL) {
        event_base_free(base);
        return -2;
    }
    evconnlistener_set_error_cb(lev, cb_accept_error);

    event_base_dispatch(base);

    evconnlistener_free(lev);
    event_base_free(base);
    return 0;
}

int main() {
    return do_server(1256);
}

已知问题:

服务器主动退出事件循环时,与event_base关联的bufferevent不会释放,网上有人说没必要,因为即将退出程序,没必要回收,所以尚未找到“优雅”的退出方式。

参考资料:

Libevent学习笔记(一):基本使用

libevent 接收TCP连接

libevent-2.0.21笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。

libevent学习__学习历程总结

高性能I/O框架库libevent The libevent API provides a mechanism to execute a callback function when a specif...
  • callinglove
  • callinglove
  • 2014年11月26日 16:43
  • 4334

学习使用libevent(一)

PRE——写在前面的话 最近在学习libevent,希望可以好好整理一下~ 计划是这样,先简单总结一下怎么使用它,然后开始分析源代码。 其实,目前网上已经有不少相关资料,比如说,官网(http:...
  • hjason2042
  • hjason2042
  • 2012年12月08日 21:39
  • 4753

libevent框架初步学习

libevent是一种开源的轻量级的优秀I/O框架库,它可以跨平台,可以统一处理I/O、信号和定时事件,可以使用不同的I/O复用方式,较新版本使用libevent_pthreads库对并发编程提供支持...
  • xijiacun
  • xijiacun
  • 2015年05月06日 22:10
  • 392

libevent学习五

event loop 事件循环 一旦你向event_base注册了一些event,那你接下来希望Libevent等待事件的发生并且通知你。 接口 #define EVLOOP_ONCE ...
  • huanzai2
  • huanzai2
  • 2015年01月27日 11:13
  • 1076

libevent源码学习-----阅读心得

框架设计思路 libevent使用统一事件源将所有问题都转化为event,比如将套接字/信号/描述符都在内部转化为event,由相应的io多路复用函数进行监控。 为了提供对超时event的支持,lib...
  • sinat_35261315
  • sinat_35261315
  • 2017年10月12日 09:51
  • 105

Libevent源码分析-----与event相关的一些函数和操作

Libevent提供了一些与event相关的操作函数。本文就重点讲一下这方面的源代码。   在Libevent中,无论是event还是event_base,都是使用指针而不会使用变量。实际上,如果...
  • luotuo44
  • luotuo44
  • 2014年08月21日 22:49
  • 3417

libevent2.0源码学习三:对网络模型的(EPOLL)的封装

Libevent的核心是事件驱动、同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows、Linux、Unix等不同平台上却各有不同,所以,libevent对系统底...
  • AAA20090987
  • AAA20090987
  • 2014年02月19日 15:34
  • 3076

一篇不错的libevent入门教程

转自 http://www.felix021.com/blog/read.php?2068  首先给出官方文档吧: http://libevent.org ,首页有个Programming wi...
  • ti_an_1989
  • ti_an_1989
  • 2014年03月07日 15:05
  • 6103

Libevent源码学习(四) 事件内部流程解析下部

上一节过后,大家应该对于事件状态转换有了一定的了解,具体的代码部分也已经详细分析到了事件状态转换为EVLIST_INSERTED状态.下面接着上面的部分接着说明. 1.事件链表 上节提到过很多次链表这...
  • baidu_28563321
  • baidu_28563321
  • 2015年10月31日 10:59
  • 356

libevent学习四

构建event_base 在你开始使用任何Libevent前,你需要先创建一个或多个event_base。每个event_base管理着一个event的集合,并可以检测出哪些event被激活了。如果e...
  • huanzai2
  • huanzai2
  • 2015年01月22日 23:00
  • 810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:libevent学习.1
举报原因:
原因补充:

(最多只允许输入30个字)