• QQ旅程server分析01-网关server


    网关server网络进程:
    s1.连接网关管理器
    s2.上报自身信息给网关管理器
    s3.从网关管理器获取自己的管理信息
    *s4.依照管理信息预分配好须要的资源
    s5.网关server打开client监听port
    s6.网关server開始转发“管理器”和client的数据
    *网关server全然不理解来自client的数据(对client而言是透明的)
    *网关server和“管理器”之间存在协议栈,有五个高级命令:转发,广播转发,T下线1,T下线2。关闭网关
    *网关server会定时给“管理器”发送心跳请求ping
    *网关server会维护client状态机:Freed、Starting、InUse、Stoping
    GateWayServer抽象网关逻辑以及和管理器的连接,处理管理器命令,而且转发client和管理器的消息
    GWClient抽象网关到client连接。负责处理网关和client的逻辑
    网关启动后。GateWayServer会打开监听port。当新的连接上来以后,会创建一个新的GWClient对象,而且将新的socket连接郊游GWClient管理。

    GWClient管理client和网关server之间的通讯数据:接受到client的数据会交由GameWayServer对象转发到指定的管理器。GameWayServer也会将管理器发送给client的数据交由GWClient发送到client。

    即在网关server内部:GWClient做为client的代理,GateWayServer做为管理器(逻辑server)的代理。

    // 禁用nagles算法
    int nodelay = 1;
    if(ACE_OS::setsockopt(new_handle,IPPROTO_TCP, TCP_NODELAY,(char*)&nodelay,sizeof(nodelay))==-1)
    {
    ACE_ERROR( ( LM_ERROR, ACE_TEXT("Set socket TCP_NODELAY failed!! ")) );
    }
    缺陷:
    1.缺少对client的安全检測。或许是放到后面的逻辑server上去做了。不能排除恶意连接,或者误操作的连接,全部的连接都被accept上来。然后做数据交换。

    2.数据的分发上。好像一个网关server仅仅能相应一个管理器(逻辑server)
    3.网关仅仅能标识到连接(SettionID是用户逻辑无关的),无法识别到详细逻辑client
    尝试做低级抽象:
    IGateWayClientAccpetor
      OnClientAccept
    IGateWay2ClientSession
      SessionID
      OnConnect
      OnRead
      OnWrite
    IGateWay2ManagerSession
      SessionID
      OnConnect
      OnRead
      OnWrite
      
    IGateWayDataRouter
      OnAccessRouting(IGateWay2ClientSession)
      OnAccessRouting(IGateWay2ManagerSession)
      OnGateWay2ClientSessionRead(来自client的数据。当前代码下。会转发给唯一的管理器处理)
      OnGateWay2ManagerSession(来自管理器的数据。假设是须要转发给client的数据。会包括有clientSessionId)

    协议概览:
    网关管理server 协议:
    enum EGWMgrMsgType
    {
    GWMMT_Msg, // Route server msg to clients.
    GWMMT_MsgAll, // Route server msg to all clients.
    GWMMT_Droped, // *A client has been droped by manager( actively or disconnect ack ).
    GWMMT_DropedDiscard, // *A client has been droped by manager( actively or disconnect ack ).
    GWMMT_Shutdown, // Shutdown gateway server.
    GWMMT_Max,
    };
    GWMMT_Msg: 转发消息到指定client
    GWMMT_MsgAll: 转发广播消息到所有client
    GWMMT_Droped: 网关管理器T掉指定client
    GWMMT_DropedDiscard: 网关管理器T掉指定client
    GWMMT_Shutdown: 关闭网关server
    ---------------------------------------------------------------------------------------
    网关server 协议:
    enum EGWSVMsgType
    {
    GWSMT_CLJoin, // New client join.
    GWSMT_CLDisconnected, // Client disconnected.
    GWSMT_Msg, // Route client message to server.
    GWSMT_Ping, // gateway ping message to server.
    GWSMT_Max,
    };
    GWSMT_CLJoin: 新连接client
    GWSMT_CLDisconnected: client连接断开
    GWSMT_Msg: 将client的消息转发到server
    GWSMT_Ping: 网关server到逻辑server的ping
    -----------------------------------------------------------------------------------
    网关server消息头:
    struct GWMsgHdr
    {
    GWMsgHdr( u_int type, u_int len ):type_( type ), data_len_(len){}
    u_int type_; // Msg type.
    u_int data_len_; //
    };
    ------------------------------------------------------------------------------------
    网关上报给网关管理器的自身信息
    struct GWLocalInfo  // 监听client连接的endpoint
    {
    u_int addr_; // Gateway listen address.
    u_short port_;
    };
    ------------------------------------------------------------------------------------
    网关从网关管理器接受的信息
    struct GWInfo
    {
    u_int id_; // Gateway server id.
    u_int cl_num_; // Client num.
    };

    设计特点:
    1.启动參数通过内存共享。本地,能够被其它程访问程序,也许直接向共享集群,没有深入看一下

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    屏幕适配问题
    对八大排序算法的补充说明
    基数排序
    归并排序
    快速排序
    简单选择排序
    堆排序
    希尔排序
    直接插入排序
    (转)Android APK反编译详解
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4676409.html
Copyright © 2020-2023  润新知