0.gateserver负责所有与客户端的直接连接
m_conns[10000]也就是一个gateserver最多可以维持10000条socket连接,蓝月采用的是tcp
行走各种消息都是tcp,不存在丢包一说,只会延迟
每个客户端点击登录时会做以下事情
建立socket tcp连接,向gateserver 的ip port发送请求,
gateserver收到后,建立连接,这时候客户端与gateserver之间socket连接成功.
gateserver将这个conn(gateserver与这个客户端的连接)加入m_conns中。
1 gateserver与gameserver之间的通信
用户登录成功,获取角色等过程暂时忽略,直接进入后面游戏协议
客户端发送cm_game_pro 给gateserver,gateserver转发给gameserver
这里每个user都有一个gameconn,这个连接表示此玩家gateserver与gameserver之间用的哪个连接
2 gameserver的处理
收到消息放到一个消息队列,单独线程轮训此消息队列,处理
发过来的消息都会有index,这个字段表示的是,此玩家客户端对应的gateserver哪个连接,
第一次时候gameserver此时还没有此玩家的记录
gameserver维护一个m_users[10000]
对每一个新来的连接index,分配对应的m_users[index]
3 select,epoll,socket
int ret = select(0, rfds, wfds, NULL, &m_timeout);
这句话的意思就是,系统监听多个socket连接,发现那个有变化就会知道,具体暂时略过
总之ret>0说明有了变化
//大于0说明有消息可发
//等于0说明异常,连接断开了
之前的处理是,当异常,直接remove(pConn),然后处理一系列后续操作,玩家离线,登出等处理
4 断线重连
以上流程已经搞清楚了 断线重连也不难
两种:断开连接重新登录,断开连接不需重新登陆
当select/epoll send recv结果为0,本来连接直接断开的,现在保留60s
因为手机环境下,打电话,移动网络等很大概率很频繁会出现断网,也就是socket完全断开的情况
因此,断开不能理解就把整个connection remove掉,remove掉就是跟页游端玩家退出游戏一样,
类似妖妖平台的DOTA,断开连接 会尝试连接,1分钟连不上那么就判断完全断开,结束游戏
引用