网关处理数据的主循环——基于wIdent的值DecodeTimerTimer

 

 

作者:佚名 更新时间:2021-03-11 浏览次数:

RunGate具有三个Socket对象,一个用于发送到M2,另一个用于接收客户端连接。还有一个连接控制台(当然这是绑定到控制台的,通常不需要手动启动,但是私服架设者可以在私服中使用它很方便)

控制台套接字将定期发送保持活动数据包到控制台。如果未发送,则控制台必须知道运行器没有响应或已关闭,然后可以立即将其打开。纯粹是为了简化私服个虚假的错误。

实际上,只有两个Socket对象是最重要的。 M2Sokcet和ClientSocket。

当然,整个结构是使用的典型生产者-消费者模型。但是代码结构还不清楚。消息处理是使用Timer而不是线程进行处理。

程序通过一个常量定义堆栈上的会话数。当程序开始运行时,堆栈上将有一个数组来保存会话信息。会话信息是一种结构,并且在内部记录会话信息,例如连接时间,数据包大小

最后一次移动的时间,最后一次通信的时间,等等。

有客户端连接时。在预缩放数组中会发现未使用的空间。初始化此数组的内容传奇sf多线程网关控制器,以使当前客户端连接保持在该会话内。

当从客户那里收到信息时,将进行一系列的法律验证或保护。最后传奇sf多线程网关控制器,将消息生成为消息正文:

ReviceMsgList.Add(UserData); //添加到接收到的消息列表中。

从服务器接收消息时。将邮件头转换为以下邮件格式:

 TMsgHeader = packed record
    dwCode: LongWord;
    nSocket: Integer;
    wGSocketIdx: Word;
    wIdent: Word;
    wUserListIndex: Integer;
    nLength: Integer;
  end;

记录消息的类型,长度和套接字句柄。根据wIdent的值

          case pMsg.wIdent of
            GM_CHECKSERVER: begin //客户端需要先验证网关
                boCheckServerFail := False;
                dwCheckServerTimeMin := GetTickCount - dwCheckServerTick;
                if dwCheckServerTimeMin > dwCheckServerTimeMax then
                  dwCheckServerTimeMax := dwCheckServerTimeMin;
                //dwCheckServerTick := GetTickCount();
              end;
            GM_SERVERUSERINDEX: begin //wGSocketIdx 为服务端的Socket句柄 这句主要是修改wUserListIndex。暂时没看出要干嘛
                if (pMsg.wGSocketIdx < RUNATEMAXSESSION) and (pMsg.nSocket =
                  SessionArray[pMsg.wGSocketIdx].nSckHandle) then begin
                  SessionArray[pMsg.wGSocketIdx].nUserListIndex := pMsg.wUserListIndex;
                end;
              end;
            GM_RECEIVE_OK: begin
                {dwCheckServerTimeMin := GetTickCount - dwCheckRecviceTick;
                if dwCheckServerTimeMin > dwCheckServerTimeMax then dwCheckServerTimeMax := dwCheckServerTimeMin;
                dwCheckRecviceTick := GetTickCount(); }
                SendServerMsg(GM_RECEIVE_OK, 0, 0, 0, 0, nil); //消息到达处理,貌似很没必要吧。应该是M2会做一些处理
              end;
            GM_DATA: begin
                ProcessMakeSocketStr(pMsg.nSocket, pMsg.wGSocketIdx, MsgBuff, pMsg.nLength);//进行编码处理后 加入到每个会话的列表(实际是string)。此时并不是发送,并将消息加入SendMsgList;
              end;
            GM_TEST: begin
              end;

 

 
 

最新文章:传奇私服祖玛教主之家地图对应的小地图_文字位置图例游戏策略 传奇私服手游泡点_脱机气泡点图例专用服务器 单职业热血传奇私服_单个专业图例私有服务器版本 传奇私服道士毒强化有什么作用_热血传奇:道教毒药有什么区别? 传奇私服手游泡点_Popodian Legend手机游戏下载 传奇私服魔剑士_DNF:Magic Swordsman卡由商人垄断,一张9400万金币,当地暴君愿意购买! 单职业热血传奇私服_单个职业传奇手游私人服务器光束版本v 1. 1. 1 冰雪传奇外挂_《火龙冰雪传奇》手游:如果传奇游戏要持久,那么它必须抵制插件的存在! 新闻内容 古惑仔电影 热门新闻 热门游戏 最新传奇游戏 网站地图 古惑仔私服传奇

★★★★★★★★★★★★★★★今日18点开放最后个良心服★★★★★★★★★★★★★★★★★★-推荐★★★★★★★★★★★★★★★★★
★★★★★★★★★★★★★★★今日18点开放最后个良心服★★★★★★★★★★★★★★★★★★-推荐★★★★★★★★★★★★★★★★★