libevent源代码分析--buffer的使用

本文分析了libevent的bufferevent结构体,指出其如何解决Windows和Unix平台上的性能问题,简化了网络编程。bufferevent内部维护了输入和输出buffer,并在数据读写和错误发生时调用相应回调。使用步骤包括设置socket非阻塞、创建bufferevent、设置回调函数、启用读写事件。通过对关键函数的解析,如bufferevent_socket_new、bufferevent_setcb和bufferevent_enable,展示了如何利用bufferevent处理网络数据。
摘要由CSDN通过智能技术生成
你可能注意到随着我们代码变得越来越高效,程序也变得更加复杂。当我们产生一个进程的时候,我们没有必要为每一个链接管理一个buffer,我们只需要每个处理独立栈分配缓冲区就可以了。在读和写的时候,我们不必明确的跟踪每一个socket,这在我们的代码里是一个暗示,我们没有必要定义一个结构体去跟踪每一个操作什么时候完成,我们只需要使用循环栈变量就可以了。

         此外,如果你在windows网络编程方面有着丰富的经验,当你在使用上一篇博客中的例子时,你可能认识到libevent可能达不到最理想的性能。在windows上,你做的快速异步IO不是用的select,它使用的IOCP API。和其他的快速网络API不同,当你的程序执行完成,sock准备完成,IOCP不会通知你的程序,取而代之的是,程序告诉windows网络栈开启一个网络操作,并且当操作执行完成时,IOCP会告诉程序。

         幸运的是,libevent2 的bufferevents接口解决了上面的这些冲突,它使得程序更加容易写,并且为windows和unix提供了有效的接口。

分析:

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了,上一篇博客是自己维护一个buffer,维护过程复杂,且过程难以理解,既然libevent自己提供了bufferevent这个神器,且有API,何必自己维护呢?

先看看struct bufferevent这个结构体

  1. struct bufferevent {  
  2.                struct event_base *ev_base;  
  3.         const struct bufferevent_ops *be_ops;  
  4.         struct event ev_read;  
  5.         struct event ev_write;  
  6.         struct evbuffer *input;  
  7.         struct evbuffer *output;  
  8.         ……  
  9.         bufferevent_data_cb readcb;  
  10.         bufferevent_data_cb writecb;  
  11.         bufferevent_event_cb errorcb;  
  12.         ……  
  13. }  

可以看出struct bufferevent内置了两个event(读/写)和对应的缓冲区。当有数据被读入(input)的时候,readcb被调用,当output被输出完成的时候,writecb被调用,当网络I/O出现错误,如链接中断,超时或其他错误时,errorcb被调用。

使用bufferevent的过程:

1. 设置sock为非阻塞的

  1. eg:  evutil_make_socket_nonblocking(fd);  

2. 使用bufferevent_socket_new创建一个structbufferevent *bev,关联该sockfd,托管给event_base

函数原型为:

  1. struct bufferevent * bufferevent_socket_new(struct event_base *base, evutil_socket_t fd,  int options)  
  2. eg:  struct bufferevent *bev;  
  3. bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);  

3. 设置读写对应的回调函数

函数原型为:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值