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


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

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

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

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

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

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

    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就删了,不发了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    算法和数据结构解析-9 : 排序相关问题讲解
    Windows Server 2016 Standard 激活,亲测有效
    java计算机毕业设计高校在线办公系统源码+数据库+系统+lw文档+mybatis+运行部署
    LeetCode:1337. 矩阵战斗力最弱的 K 行、11. 盛最多水的容器、剑指 Offer 51. 数组中的逆序对题解
    标题:Java中的逻辑与、短路与、逻辑或、短路或操作解析
    当中国走进全球化的“深水区”,亚马逊云科技解码云时代的中国式跃升
    车载测试中:如何处理 bug
    我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:面向人群和教程特点
    【LeetCode-中等】33.搜索旋转排序数组 - 二分法
    Septentrio接收机二进制的BDS b2b改正数解码
  • 原文地址:https://blog.csdn.net/qq_51721904/article/details/128190593