Libevent中读消息流程

14 篇文章 0 订阅
3 篇文章 0 订阅

关于接收监听并建立连接得到通讯套接字过程请参考Libevent监听事件的建立过程文档。

涉及到的几个结构体

 

struct bufferevent_private

{

         //主要的结构体

                   structbufferevent bev;

                   structevbuffer_cb_entry *read_watermarks_cb;

                   unsignedown_lock : 1;

         //为简化省略了一些变量声明

            struct bufferevent_rate_limit*rate_limiting;

};

struct event_watermark

{

         size_t low;

         size_t high;

};

struct bufferevent

 {

         structevent_base *ev_base;    

         const struct bufferevent_ops *be_ops;    

         struct event ev_read;        

         struct event ev_write;       

         structevbuffer *input;     

         structevbuffer *output;

         structevent_watermark wm_read;

         structevent_watermark wm_write;

    //回调函数

         bufferevent_data_cb readcb;

         bufferevent_data_cb writecb;

         bufferevent_event_cb errorcb;

    //回调参数

         void*cbarg;

         structtimeval timeout_read;

         structtimeval timeout_write;

    //事件类型

         shortenabled;

};

 

 

在监听回调事件中代码如下:

static voidlistener_cb(struct evconnlistener *listener,evutil_socket_t fd,struct sockaddr *sa, int socklen, void*user_data)

{

         structevent_base *base = (struct event_base*)user_data;

         structbufferevent *bev;    

         bev = bufferevent_socket_new(base, fd,BEV_OPT_CLOSE_ON_FREE);      

         bufferevent_setcb(bev, conn_readcb,conn_writecb, conn_eventcb, NULL);

         bufferevent_enable(bev,EV_WRITE|EV_READ);

}

1.先来看看bufferevent_socket_new函数。

struct bufferevent *

bufferevent_socket_new(struct event_base *base, evutil_socket_t fd,int options)

{

   //创建bufferevent_private结构体

   // bufferevent_init_common对该结构体进行参数初始化,在该函数中,

   // 通过bufev->input= evbuffer_new()语句新建evbuffer并赋值。

   //传递函数指针struct bufferevent_ops  给bufferevent

   bufferevent_init_common(bufev_p, base,&bufferevent_ops_socket,options)

   //对bufferevent中的读写事件赋值

 event_assign(&bufev->ev_read,bufev->ev_base, fd,EV_READ|EV_PERSIST, bufferevent_readcb, bufev);

event_assign(&bufev->ev_write,bufev->ev_base, fd,EV_WRITE|EV_PERSIST, bufferevent_writecb, bufev);

//设置输入输出缓冲的释放顺序标志

//将buffevevent返回

}

2. bufferevent_setcb(bev, conn_readcb,conn_writecb, conn_eventcb, NULL);

将回调函数设置到bufferevent结构体上。内部进行了线程保护。

3.bufferevent_enable(bev, EV_WRITE|EV_READ)

调用指针结构体的be_socket_enable(struct bufferevent *bufev, shortevent)

该函数内部又调用be_socket_add(&bufev->ev_read,&bufev->timeout_read)

该函数内部又调用event_add(ev,NULL);

该函数内部又调用event_add_internal(ev,tv, 0);

最后将该事件增加到eventBase的哈希表中,并增加到底层监听结构里。

注意读写事件时分别增加的事件,所以一个fd如果要支持读和写的功能,需要增加2个事件。

4. 回调处理

在event_assign函数中读回调用的是bufferevent_readcb,因此当读事件发生时,调用的是bufferevent_readcb函数。

在该函数中

//获取最大可以读取的字节数

readmax =_bufferevent_get_read_max(bufev_p);

//读取数据

res =evbuffer_read(input, fd, (int)howmuch);

//调用用户回调函数

_bufferevent_run_readcb(bufev);

//调用回调

bufev->readcb(bufev,bufev->cbarg);

5.读取过程

     struct evbuffer *input =bufferevent_get_input(bev);

         memset(buf,0,sizeof(buf));

         sz=evbuffer_get_length(input);

         if (sz> 0)

         {

                   bufferevent_read(bev,buf,sz);

     }

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中安装libevent可以按照以下步骤进行操作: 1. 首先,通过libevent的官网(https://libevent.org/)下载libevent的版本。 2. 下载完成后,解压缩下载的文件。 3. 打开终端,进入解压后的libevent目录。 4. 在终端中运行以下命令,开始编译和安装libevent: ``` ./configure make sudo make install ``` 这些命令将会配置、编译和安装libevent。 5. 安装完成后,可以通过运行以下命令检查libevent是否成功安装: ``` ldconfig -v | grep libevent ``` 如果输出结果中包含libevent.so动态库文件的路径,表示安装成功。 以上步骤可以确保在Linux系统中成功安装libevent。如果在编译过程中出现找不到库文件的错误,可以尝试以下解决方法: 1. 检查是否已经在/usr/lib目录下找到了libevent.so动态库文件。如果没有找到,可以通过创建软连接的方式解决。在终端中运行以下命令: ``` ln -s 库文件绝对路径 /usr/lib/libevent.so ``` 这将会创建一个软连接,将库文件链接到/usr/lib目录中。 通过以上步骤,您应该能够成功在Linux中安装libevent,并解决相关的错误。希望对您有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Linux】Linux系统下libevent库的安装](https://blog.csdn.net/qq_43411563/article/details/107413703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Linux环境下,安装libevent库](https://blog.csdn.net/xyz_unknown/article/details/128130408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Linux下编译安装php libevent扩展实例](https://download.csdn.net/download/weixin_38692666/12807205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值