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

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;
}

猜你喜欢

转载自blog.csdn.net/skytering/article/details/104285102