Libevent库笔记(三)服务器和客户端开发的最基本的流程

10 篇文章 0 订阅
4 篇文章 0 订阅

1.TCP服务端和客户端开发最基本流程

1.1.服务端编程流程

1、创建event_base_new()创建框架上下文对象event base
2、evconnlistener_new_bind分配一个监听器对象,监听给定地址上的TCP连接,通知设置监听回调(当新连接到来时,框架会调用)。
备注:这个函数相当于完成系统调用socket()、bind()、listen(),并设置accept回调函数
(1)在监听回调中通过一个已存在的socket描述符创建socket bufferevent;
(2)设置bufferevent事件的回调函数;
(3)启用/禁用bufferevent相关写缓存区
3、启动事件调度循环event_base_dispatch()
4、根据业务逻辑进行读写操作bufferevent_read() /bufferevent_write()
5、结束则释放相关资源;

1.2.客户端编程流程

1、创建event_base_new()创建框架上下文对象event base
2、使用bufferevent socket new()创建和服务器通讯的bufferevent事件
3、设置bufferevent事件的事件回调函数bufferevent_setcb(),在事件回调体中
(1)判断events事件值为BEV_EVENT_CONNECTED,则进行连接成功的逻辑处理;
(2)判断events事件值为BEV_EVENT_ERROR,则进行连接发生错误的逻辑处理;
4、bufferevent_socket_connect()连接服务器
(1)若直接返回-1,则代表已经出错,进行出错逻辑处理;
(2)如果返回0,则代表几种可能,可能成功,也可能还在握手阶段,具体根据设置的事件回调中进行判断
5、启动事件调度循环event_base_dispatch()
6、根据业务逻辑进行读写操作bufferevent_read() /bufferevent_write()
7、结束则释放相关资源;

1.3.服务端示例代码

参考官方源码包中的hello-world.c。
注释版见地址:
Libevent库笔记(二)样例代码hello-world的注解版本

1.4.客户端编程示例代码

说明:此代码来自于网络文章,太多的文章中使用了此代码,也不知道哪个是原创了。

#include <event2/event.h>
#include <event2/bufferevent.h>
#include <sys/socket.h>
#include <string.h>

void eventcb(struct bufferevent *bev, short events, void *ptr)
{
    if (events & BEV_EVENT_CONNECTED) {
         
    } else if (events & BEV_EVENT_ERROR) {
         /* An error occured while connecting. */
    }
}

int main_loop(void)
{
    struct event_base *base;
    struct bufferevent *bev;
    struct sockaddr_in sin;

    base = event_base_new();

    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */
    sin.sin_port = htons(8080); /* Port 8080 */

    bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);

    bufferevent_setcb(bev, NULL, NULL, eventcb, NULL);

    if (bufferevent_socket_connect(bev,
        (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        /* Error starting connection */
        bufferevent_free(bev);
        return -1;
    }

    event_base_dispatch(base);
    return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: int main int argc char argv[] { #ifdef Q OS LINUX QCoreApplication::setEventDispatcher new EventDispatcherLibEvent ; qInstallMessageHandler customMessageHandler ; #endif QCoreApplication a argc argv ; auto ser new ConfigServer; ser >startServer ; return a exec ; } 在 pro文件添加 linux{ LIBS + levent core SOURCES + common eventdispatcher libevent eventdispatcher libevent cpp common eventdispatcher libevent eventdispatcher libevent config cpp common eventdispatcher libevent eventdispatcher libevent p cpp common eventdispatcher libevent socknot p cpp common eventdispatcher libevent tco eventfd cpp common eventdispatcher libevent tco pipe cpp common eventdispatcher libevent tco cpp common eventdispatcher libevent timers p cpp HEADERS + common eventdispatcher libevent common h common eventdispatcher libevent eventdispatcher libevent h common eventdispatcher libevent eventdispatcher libevent config h common eventdispatcher libevent eventdispatcher libevent config p h common eventdispatcher libevent eventdispatcher libevent p h common eventdispatcher libevent libevent2 emul h common eventdispatcher libevent qt4compat h common eventdispatcher libevent tco h common eventdispatcher libevent wsainit h } 可以直接跨平台了使用了 csdn博客:http: blog csdn net rushroom">最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值