TeamTalk中msg_server初始化工作,如何维护与其他服务器的心跳连接

不管是分析哪个server, 第一步就是去看它的main函数文件, msg_server对应的main函数在msg_server.cpp 中
1:先通过CConfigFileReader这个类来解析配置文件(msgserver.conf)。

 //通过以下接口获取配置信息
 config_file.GetConfigName 

2:通过netlib_listen 监听发送给msg_server的信息

//epoll的方式,以下接口已经把listenfd放入epoll的消息循环中了
ret = netlib_listen();

3:通过CStrExplode 这个类来获取有多少个需要监听的IP

//(默认0.0.0.0)表示监听本机所有网卡。
CStrExplode listen_ip_list(listen_ip, ';');

4:初始化msg_server服务器自己的定时机制

init_msg_conn();

//添加一个定时器,需要注意的是,这个定时器是每秒触发一次,而不是一次性的
netlib_register_timer(msg_conn_timer_callback, NULL, 1000);

//添加了定时器在哪触发呢? 在EventDispatch.cpp 78行
_CheckTimer();

//为何说它是轮询任务,而不是一次性的呢?
pItem->next_tick += pItem->interval; //可以看出每次执行后又重新设置了时间

//查看定时器回调函数,在MsgConn.cpp45行
msg_conn_timer_callback()
把g_msg_conn_map维护的连接都执行一次任务
pConn->OnTimer(cur_time);

//每过5分钟记录一次丢包率
if (cur_time > g_last_stat_tick + LOG_MSG_STAT_INTERVAL) 

//进入OnTimer
//主要检查四种情况,1:若是手机用户,5分钟没有收到心跳包就断开。
//2:PC端 2分钟没有收到心跳包就断开。
//3:刚登陆的时候msg_server需要把用户信息发送给db_server验证,若15s没有验证成功就断开。
//如果验证成功了IsOpen()返回true
//4:一些待发送的消息,如果时间超过了15s就删了,不发了

5:设置与其他服务器的连接机制, 这里只以init_db_serv_conn为例子

init_db_serv_conn();

//msg_server主动去连接db服务器
serv_init<CDBServConn>(g_db_server_list, g_db_server_count);//自己点进去看  

//添加msg_server与db_server的定时器
netlib_register_timer(db_server_conn_timer_callback, NULL, 1000);

//进入定时回调函数 db_server_conn_timer_callback
//同样是遍历每一条与db的连接
ConnMap_t::iterator it = g_db_server_conn_map.begin(); it != g_db_server_conn_map.end(); 
//然后执行pConn->OnTimer(cur_time),这里需要注意执行的前提是
(pConn->IsOpen()) //若满足则表示这条连接信息(用户账号密码)是通过验证了的

//看最后一行 就是重新连接机制
//4s, 8s, 16s, 32s, 64s, 4s 8s的形式,自己分析
serv_check_reconnect<CDBServConn>(g_db_server_list, g_db_server_count);

//进入pConn->OnTimer(cur_time)
//这里面就是心跳包的机制了,每5秒发送一次
curr_tick > m_last_send_tick + SERVER_HEARTBEAT_INTERVAL //5s

//若30s没有收到对方回应,则关闭连接
if (curr_tick > m_last_recv_tick + SERVER_TIMEOUT) //30s


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值