⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 runsock.~pas

📁 M2原代码 M2原代码
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
    try
      sData:=DecodeString(sMsg);
//      MainOutMessage(sData);
      if (Length(sData) > 2) and (sData[1] = '*') and (sData[2] = '*') then begin
        sData:=Copy(sData,3,Length(sData)-2);
        sData := GetValidStr3 (sData, sAccount,['/']);
        sData := GetValidStr3 (sData, sChrName, ['/']);
        sData := GetValidStr3 (sData, sCodeStr, ['/']);
        sData := GetValidStr3 (sData, sClientVersion, ['/']);
        sIdx := sData;
        nSessionID:=Str_ToInt(sCodeStr,0);
        if sIdx = '0' then begin
          boFlag:=True;
        end else begin//004E0F37
          boFlag:=False;
        end;
        if (sAccount <> '') and (sChrName <> '') and (nSessionID >= 2) then begin
          nClientVersion:=Str_ToInt(sClientVersion,0);
          Result:=True;
        end;
      end;//004E0F68
    except
      MainOutMessage(sExceptionMsg);
    end;
  end;
var
  nCheckCode:Integer;
  sData:String;
  sAccount,sChrName:String;
  nSessionID:Integer;
  boFlag:Boolean;
  nClientVersion:Integer;
  nPayMent,nPayMode:Integer;
  SessInfo:pTSessInfo;
ResourceString
  sExceptionMsg = '[Exception] TRunSocket::DoClientCertification CheckCode: ';
  sDisable      = '*disable*';
begin
  nCheckCode:=0;
  try
//    AddMainLogMsg(tMsg);
    if GateUser.sAccount = '' then begin
      if TagCount(sMsg,'!') > 0 then begin
        sData := ArrestStringEx (sMsg, '#', '!', sMsg);
        sMsg:=Copy(sMsg,2,Length(sMsg)-1);
//        MainOutMessage('1 ' + sMsg);
        if GetCertification(sMsg,sAccount,sChrName,nSessionID,nClientVersion,boFlag) then begin
          if ScanCertification(sAccount,sChrName,nSessionID,nClientVersion) then exit;

          SessInfo:=FrmIDSoc.GetAdmission(sAccount,GateUser.sIPaddr,nSessionID,nPayMode,nPayMent);
            
          if (SessInfo <> nil) and (nPayMent > 0) then begin
            GateUser.boCertification:=True;
            GateUser.sAccount:=Trim(sAccount);
            GateUser.sCharName:=Trim(sChrName);
            GateUser.nSessionID:=nSessionID;
            GateUser.nClientVersion:=nClientVersion;
            GateUser.SessInfo:=SessInfo;
            try//004E11C9
              FrontEngine.AddToLoadRcdList(sAccount,
                                   sChrName,
                                   GateUser.sIPaddr,
                                   boFlag,
                                   nSessionID,
                                   nPayMent,
                                   nPayMode,
                                   nClientVersion,
                                   nSocket,
                                   GateUser.nGSocketIdx,
                                   GateIdx);
            except
              MainOutMessage(format(sExceptionMsg,[nCheckCode]));
            end;
          end else begin//004E1244
            nCheckCode:=2;
            GateUser.sAccount:=sDisable;
            GateUser.boCertification:=False;
            CloseUser(GateIdx,nSocket);
            nCheckCode:=3;
          end;
        end else begin//004E1276
          nCheckCode:=4;
          GateUser.sAccount:=sDisable;
          GateUser.boCertification:=False;
          CloseUser(GateIdx,nSocket);
          nCheckCode:=5;
        end;
      end;
    end;//004E12A6
  except
    MainOutMessage(format(sExceptionMsg,[nCheckCode]));
  end;
end;

function TRunSocket.SendGateBuffers(GateIdx:Integer;Gate:pTGateInfo;MsgList:TList):Boolean;//004E1930
var
  dwRunTick    :LongWord;
  BufferA      :PChar;
  BufferB      :PChar;
  BufferC      :PChar;
  I            :Integer;
  nBuffALen    :Integer;
  nBuffBLen    :Integer;
  nBuffCLen    :Integer;
  nSendBuffLen :Integer;
ResourceString
  sExceptionMsg1 = '[Exception] TRunSocket::SendGateBuffers -> ProcessBuff';
  sExceptionMsg2 = '[Exception] TRunSocket::SendGateBuffers -> SendBuff';
begin
  Result:=True;
  if MsgList.Count = 0 then exit;
  dwRunTick:=GetTickCount();
  //如果网关未回复状态消息,则不再发送数据
  if Gate.nSendChecked > 0 then begin
    if (GetTickCount - Gate.dwSendCheckTick) > g_dwSocCheckTimeOut {2 * 1000} then begin
      Gate.nSendChecked:=0;
      Gate.nSendBlockCount:=0;
    end;
    exit;
  end;//004E198F

  //将小数据合并为一个指定大小的数据
{$IF CATEXCEPTION = TRYEXCEPTION}
  try
{$IFEND}
    I:=0;
    BufferA:=MsgList.Items[I];
    while (True) do begin
      if (I + 1) >= MsgList.Count then break;
      BufferB:=MsgList.Items[I + 1];
      Move(BufferA^,nBuffALen,SizeOf(Integer));
      Move(BufferB^,nBuffBLen,SizeOf(Integer));
      if (nBuffALen + nBuffBLen) < g_Config.nSendBlock then begin
        MsgList.Delete(I + 1);
        GetMem(BufferC,nBuffALen + SizeOf(Integer) + nBuffBLen);
        nBuffCLen:=nBuffALen + nBuffBLen;
        Move(nBuffCLen,BufferC^,SizeOf(Integer));
        Move(BufferA[SizeOf(Integer)],PChar(BufferC + SizeOf(Integer))^,nBuffALen);
        Move(BufferB[SizeOf(Integer)],PChar(BufferC + nBuffALen + SizeOf(Integer))^,nBuffBLen);
        FreeMem(BufferA);
        FreeMem(BufferB);
        BufferA:=BufferC;
        MsgList.Items[I]:=BufferA;
        Continue;
      end;
      Inc(I);
      BufferA:=BufferB;
    end;//004E1A9D
{$IF CATEXCEPTION = TRYEXCEPTION}
  except
    on e: Exception do begin
      MainOutMessage(sExceptionMsg1);
      MainOutMessage(E.Message);
    end;
  end;
{$IFEND}
  
{$IF CATEXCEPTION = TRYEXCEPTION}
  try
{$IFEND}
    while MsgList.Count > 0 do begin
      BufferA:=MsgList.Items[0];
      if BufferA = nil then begin
        MsgList.Delete(0);
        Continue;
      end;
      Move(BufferA^,nSendBuffLen,SizeOf(Integer));
      if (Gate.nSendChecked = 0) and ((Gate.nSendBlockCount + nSendBuffLen) >= g_Config.nCheckBlock) then begin
        if (Gate.nSendBlockCount = 0) and (g_Config.nCheckBlock <= nSendBuffLen) then begin
          MsgList.Delete(0); //如果数据大小超过指定大小则扔掉(编辑数据比较大,与此有点关系)
          FreeMem(BufferA);
        end else begin
          SendCheck(Gate.Socket,GM_RECEIVE_OK);
          Gate.nSendChecked:=1;
          Gate.dwSendCheckTick:=GetTickCount();
        end;
        break;
      end; //004E1B75

      MsgList.Delete(0);
      BufferB:=BufferA + SizeOf(Integer);
      if nSendBuffLen > 0 then begin
        while (True) do begin
          if g_Config.nSendBlock <= nSendBuffLen then begin
            if Gate.Socket <> nil then begin
              if Gate.Socket.Connected then begin
                Gate.Socket.SendBuf(BufferB^,g_Config.nSendBlock);
              end;//004E1BC9
              Inc(Gate.nSendCount);
              Inc(Gate.nSendBytesCount,g_Config.nSendBlock);
            end;//004E1BDC
            Inc(Gate.nSendBlockCount,g_Config.nSendBlock);
            BufferB:=@BufferB[g_Config.nSendBlock];
            Dec(nSendBuffLen,g_Config.nSendBlock);
            Continue;
          end;//004E1C05
          if Gate.Socket <> nil then begin
            if Gate.Socket.Connected then begin
              Gate.Socket.SendBuf(BufferB^,nSendBuffLen);
            end;
            Inc(Gate.nSendCount);
            Inc(Gate.nSendBytesCount,nSendBuffLen);
            Inc(Gate.nSendBlockCount,nSendBuffLen);
          end;
          nSendBuffLen:=0;
          break;
        end;
      end;//004E1C54
      FreeMem(BufferA);
      if (GetTickCount - dwRunTick) > g_dwSocLimit then begin
        Result:=False;
        break;
      end;
    end; //004E1C74
{$IF CATEXCEPTION = TRYEXCEPTION}
  except
    on e: Exception do begin
      MainOutMessage(sExceptionMsg2);
      MainOutMessage(E.Message);
    end;
  end;
{$IFEND}
  //004E1C9F
end;


procedure TRunSocket.CloseUser(GateIdx,nSocket:Integer);//004E0490
var
 i:integer;
 GateUser:pTGateUserInfo;
 tStr:String;
 Gate:pTGateInfo;
ResourceString
  sExceptionMsg0 = '[Exception] TRunSocket::CloseUser 0';
  sExceptionMsg1 = '[Exception] TRunSocket::CloseUser 1';
  sExceptionMsg2 = '[Exception] TRunSocket::CloseUser 2';
  sExceptionMsg3 = '[Exception] TRunSocket::CloseUser 3';
  sExceptionMsg4 = '[Exception] TRunSocket::CloseUser 4';
begin
  if GateIdx <= High(g_GateArr) then begin
    Gate:=@g_GateArr[GateIdx];
    if Gate.UserList <> nil then begin
      EnterCriticalSection(m_RunSocketSection);
      try
        try
          for i:=0 to Gate.UserList.Count -1 do begin
            if Gate.UserList.Items[i] <> nil then begin
              GateUser:=Gate.UserList.Items[i];
              if GateUser.nSocket = nSocket then begin
                //测试
                Gate.UserList.Delete(I);
                break;
                //004E0595
                try
                  if GateUser.FrontEngine <> nil then begin
                    TFrontEngine(GateUser.FrontEngine).DeleteHuman(i,GateUser.nSocket);
                  end;
                except
                  MainOutMessage(sExceptionMsg1);
                end;
                //004E05DE
                try
                  if GateUser.PlayObject <> nil then begin
                     TPlayObject(GateUser.PlayObject).m_boSoftClose:=True;
                  end;
                except
                  MainOutMessage(sExceptionMsg2);
                end;
                //004E0620
                try
                  if (GateUser.PlayObject <> nil) and TPlayObject(GateUser.PlayObject).m_boGhost and not TPlayObject(GateUser.PlayObject).m_boReconnection then begin
                    FrmIDSoc.SendHumanLogOutmsg(GateUser.sAccount,GateUser.nSessionID);
                  end;
                except
                  MainOutMessage(sExceptionMsg3);
                end;

                //004E0693
                try
                  Dispose(GateUser);
                  //MainOutMessage('关闭用户: ' + IntToStr(nSocket));

                  //02/04 Jacky
                  Gate.UserList.Items[i]:=nil;
                  Dec(Gate.nUserCount);
                except
                  MainOutMessage(sExceptionMsg4);
                end;
                break;
              end;
            end;
          end;
        except
          MainOutMessage(sExceptionMsg0);
        end;
      finally
        LeaveCriticalSection(m_RunSocketSection);
      end;
    end;
  end;
end;

function TRunSocket.OpenNewUser(nSocket:Integer;nGSocketIdx:Integer;sIPaddr:String;UserList:TList):Integer; //004E0364
var
  GateUser :pTGateUserInfo;
  I        :integer;
begin
  New(GateUser); 
  GateUser.sAccount        := '';
  GateUser.sCharName       := '';
  GateUser.sIPaddr         := sIPaddr;
  GateUser.nSocket         := nSocket;
  GateUser.nGSocketIdx     := nGSocketIdx;
  GateUser.nSessionID      := 0;
  GateUser.UserEngine      := nil;
  GateUser.FrontEngine     := nil;
  GateUser.PlayObject      := nil;
  GateUser.dwNewUserTick   := GetTickCount();
  GateUser.boCertification := False;
  for I:=0 to UserList.Count -1 do begin
    if UserList.Items[I] = nil then begin
      UserList.Items[I]:=GateUser;
      Result:=I;
      //MainOutMessage('连接用户: ' + IntToStr(nSocket));
      exit;
    end;
  end;
  //MainOutMessage('连接用户: ' + IntToStr(nSocket));
  UserList.Add(GateUser);
  Result:=UserList.Count - 1 ;
end;

//004E09D0
procedure TRunSocket.SendNewUserMsg(Socket:TCustomWinSocket;nSocket:Integer;nSocketIndex,nUserIdex:Integer);
var
  MsgHeader:TMsgHeader;
begin
  if not Socket.Connected then exit;
  MsgHeader.dwCode         := RUNGATECODE;
  MsgHeader.nSocket        := nSocket;
  MsgHeader.wGSocketIdx    := nSocketIndex;
  MsgHeader.wIdent         := GM_SERVERUSERINDEX;
  MsgHeader.wUserListIndex := nUserIdex;
  MsgHeader.nLength        := 0;

  if Socket <> nil then Socket.SendBuf(MsgHeader,SizeOf(TMsgHeader));
end;

//004E13EC
procedure TRunSocket.ExecGateMsg(GateIdx:Integer;Gate:pTGateInfo;MsgHeader:pTMsgHeader;MsgBuff:PChar;nMsgLen:Integer);
var
 nCheckCode :Integer;
 nUserIdx   :Integer;
 sIPaddr    :String;
 GateUser   :pTGateUserInfo;
 I          :Integer;
ResourceString
  sExceptionMsg = '[Exception] TRunSocket::ExecGateMsg %d';
begin
  nCheckCode:=0;
  try
    case MsgHeader.wIdent of
      GM_OPEN{1}: begin//004E1464
        nCheckCode := 1;
        sIPaddr    := StrPas(MsgBuff);
        nUserIdx   := OpenNewUser(MsgHeader.nSocket,MsgHeader.wGSocketIdx,sIPaddr,Gate.UserList);
        SendNewUserMsg(Gate.Socket,MsgHeader.nSocket,MsgHeader.wGSocketIdx,nUserIdx + 1 );
        Inc(Gate.nUserCount);
      end;
      GM_CLOSE{2}: begin
        nCheckCode := 2;
        CloseUser(GateIdx,MsgHeader.nSocket);
      end;
      GM_CHECKCLIENT{4}: begin//004E14DC
        nCheckCode := 3;
        Gate.boSendKeepAlive:=True;
      end;
      GM_RECEIVE_OK{7}: begin//004E14EF
        nCheckCode           := 4;
        Gate.nSendChecked    := 0;
        Gate.nSendBlockCount := 0;
      end;
      GM_DATA{5}: begin//004E150B
        nCheckCode := 5;
        GateUser   := nil;

        if MsgHeader.wUserListIndex >= 1 then begin
          nUserIdx:=MsgHeader.wUserListIndex -1;
          if Gate.UserList.Count > nUserIdx then begin
            GateUser:=Gate.UserList.Items[nUserIdx];
            if (GateUser <> nil) and (GateUser.nSocket <> MsgHeader.nSocket) then begin
              GateUser:=nil;
            end;
          end;
        end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -