Day5: Lars V0.5 tcp_conn连接属性 + Lars V0.6 消息路由分发机制

1 Lars V0.5 tcp_conn连接

        tcp_conn的作用在于让server知道目前有多少tcp连接在线。

1.1 tcp_server类

1.1.1 属性

        tcp_conn **conns:用来索引全部在线连接的集合

1.1.2 方法

        (1)针对连接集合,做添加操作

        (2)针对连接集合,做减少操作

        (3)获取连接集合的个数

        (4)保护当前连接集合的锁

    static tcp_conn **conns; //全部已经在线的连接
    static void increase_conn(int connfd, tcp_conn *conn); //新增一个连接
    static void decrease_conn(int connfd);
    static void get_conn_num(int *cur_conn); //得到当前连接个数
    static pthread_mutex_t _conns_mutex;//保护conns添加删除的互斥锁
void tcp_server::increase_conn(int connfd, tcp_conn *conn)
{
    pthread_mutex_lock(&_conns_mutex);
    conns[connfd] = conn;
    _curr_conns++;
    pthread_mutex_unlock(&_conns_mutex);
}

void tcp_server::decrease_conn(int connfd)
{
    pthread_mutex_lock(&_conns_mutex);
    conns[connfd] = NULL;
    _curr_conns--;
    pthread_mutex_unlock(&_conns_mutex);
}

void tcp_server::get_conn_num(int *curr_conn)
{
    pthread_mutex_lock(&_conns_mutex);
    *curr_conn = _curr_conns;
    pthread_mutex_unlock(&_conns_mutex);
}

2  Lars V0.6 消息路由分发机制

2.1 msg_route类

2.1.1 属性

        _router:hash_map类型<key, value> -----><消息ID,处理的业务回调函数>;

        _args:hash_map类型<key, value>-----><消息ID,处理业务回调函数的形参>;

    std::unordered_map<int, msg_callback*> _router; //针对消息的路由分发 <消息ID, 处理的业务回调函数>
    std::unordered_map<int, void*> _args; //每个路由业务函数对应的形参
2.1.2 方法

        (1)注册一个路由回调业务

    // 给一个消息ID注册一个对应的回调业务函数
    int registered_msg_router(int msgid, msg_callback* msg_cb, void *user_data){
        if(_router.find(msgid)!=_router.end())
        {
            std::cout<< "msgid: " << msgid << "is already registered"<< std::endl;
            return -1;
        }
        _router[msgid] = msg_cb;
        _args[msgid] = user_data;
        return 0;
    }

        (2)根据msgid调用一个路由回调业务

    // 调用注册的回调函数业务
    void call(int msgid, uint32_t msglen, const char *data, net_connection* conn){
        std::cout << "call msgid= " << msgid << std::endl;
        if(_router.find(msgid)==_router.end())
        {
            std::cout<< "msgid: " << msgid << "is not registered"<< std::endl;
            return;
        }

        // 取出并执行回调函数
        msg_callback* callback = _router[msgid];
        void *user_data = _args[msgid];
        callback(data, msglen, msgid, conn, user_data);
    }

2.2 msg_router集成到reactor中

2.2.1 tcp_server

        添加一个msg_router属性,初始化msg_router对象,并且给tcp_server提供一个add_msg_router(添加一个路由回调业务的方法)

// 添加一个路由分发机制句柄
    static msg_router router;
    // 提供一个添加路由的方法
    void add_msg_router(int msgid, msg_callback *cb, void *user_data=NULL){
        router.registered_msg_router(msgid, cb, user_data);
    }

        在读取完全部的client发送数据后,调用tcp_server::router.call()

tcp_server::router.call(head.msgid, head.msglen, ibuf.data(), this);

 // 调用注册的回调函数业务
    void call(int msgid, uint32_t msglen, const char *data, net_connection* conn){
        std::cout << "call msgid= " << msgid << std::endl;
        if(_router.find(msgid)==_router.end())
        {
            std::cout<< "msgid: " << msgid << "is not registered"<< std::endl;
            return;
        }

        // 取出并执行回调函数
        msg_callback* callback = _router[msgid];
        void *user_data = _args[msgid];
        callback(data, msglen, msgid, conn, user_data);
    }
2.2.2 tcp_client

        添加一个msg_router属性,给tcp_client提供一个add_msg_router(添加一个路由回调业务的方法)

// 消息分发机制
msg_router _router;

// 注册消息路由回调函数
void add_msg_callback(int msgid, msg_callback *cb, void *user_data=NULL)
{
   _router.registered_msg_router(msgid, cb, user_data);
}

        已经读取完数据之后,调用this->_router.call(),根据不同的msgid来调用不同的业务方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值