zoukankan      html  css  js  c++  java
  • 断线重连总结

    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分钟连不上那么就判断完全断开,结束游戏

    引用

    断线重连总结



  • 相关阅读:
    NAVICAT 拒绝链接的问题
    .net垃圾回收-原理浅析
    C#中标准Dispose模式的实现
    Windbg调试托管代码
    C#泛型基础
    .Net垃圾回收和大对象处理
    C++ 小知识点
    C++之虚函数表
    C++之指针与引用,函数和数组
    C++之const关键字
  • 原文地址:https://www.cnblogs.com/losophy/p/10584643.html
Copyright © 2011-2022 走看看