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来调用不同的业务方法。