不管是分析哪个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