• 断线重连总结


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

    引用

    断线重连总结



  • 相关阅读:
    C# Console.Read()和Console.ReadLine()的区别
    C#获取项目程序及运行路径的方法
    Thread理解
    ENVI 监督分类Max stdev from Mean 参数IDL中的设置
    C# 插件开发学习实例
    利用动软代码器自动生存三层架构
    结构体的对齐
    链表分类及应用
    指针
    双向循环链表
  • 原文地址:https://www.cnblogs.com/losophy/p/10584643.html
Copyright © 2020-2023  润新知