亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? massock.pas

?? MDB版本的LoginSvr跟SQL版本的傳奇源代碼。希望對大家能有用處
?? PAS
字號:
unit MasSock;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, JSocket;

type
  TMsgServerInfo = record
    sReceiveMsg: string;
    Socket:      TCustomWinSocket;
    sServerName: string;                //0x08
    nServerIndex: integer;              //0x0C
    nOnlineCount: integer;              //0x10
    dwKeepAliveTick: longword;          //0x14
    sIPaddr:     string;
  end;
  pTMsgServerInfo = ^TMsgServerInfo;

  TLimitServerUserInfo = record
    sServerName: string;
    sName: string;
    nLimitCountMin: integer;
    nLimitCountMax: integer;
  end;
  pTLimitServerUserInfo = ^TLimitServerUserInfo;

  TFrmMasSoc = class(TForm)
    MSocket: TServerSocket;

    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure MSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure MSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure MSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: integer);
    procedure MSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    procedure SortServerList(nIndex: integer);
    procedure RefServerLimit(sServerName: string);
    function LimitName(sServerName: string): string;
    procedure LoadUserLimit;
    { Private declarations }
  public
    m_ServerList: TList;
    procedure LoadServerAddr();
    function CheckReadyServers(): boolean;
    procedure SendServerMsg(wIdent: word; sServerName, sMsg: string);
    procedure SendServerMsgA(wIdent: word; sMsg: string);
    function IsNotUserFull(sServerName: string): boolean;
    function ServerStatus(sServerName: string): integer;
    function GetOnlineHumCount(): integer;
    { Public declarations }
  end;

var
  FrmMasSoc:  TFrmMasSoc;
  nUserLimit: integer;
  UserLimit:  array[0..99] of TLimitServerUserInfo;

implementation

uses LSShare, LMain, HUtil32, Grobal2;

{$R *.DFM}
//00465934
procedure TFrmMasSoc.FormCreate(Sender: TObject);
var
  Config: pTConfig;
begin
  Config := @g_Config;
  m_ServerList := TList.Create;
  MSocket.Address := Config.sServerAddr;
  MSocket.Port := Config.nServerPort;
  MSocket.Active := True;
  LoadServerAddr();
  LoadUserLimit();
end;
//00465B08
procedure TFrmMasSoc.MSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  I: integer;
  sRemoteAddr: string;
  boAllowed: boolean;
  MsgServer: pTMsgServerInfo;
begin
  sRemoteAddr := Socket.RemoteAddress;
  boAllowed   := False;
  for I := Low(ServerAddr) to High(ServerAddr) do
    if sRemoteAddr = ServerAddr[I] then begin
      boAllowed := True;
      break;
    end;
  if boAllowed then begin
    New(MsgServer);
    FillChar(MsgServer^, SizeOf(TMsgServerInfo), #0);
    MsgServer.sReceiveMsg := '';
    MsgServer.Socket      := Socket;
    m_ServerList.Add(MsgServer);
  end else begin
    MainOutMessage('非法地址連接:' + sRemoteAddr);
    Socket.Close;
  end;
end;
//00465C54
procedure TFrmMasSoc.MSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  I: integer;
  MsgServer: pTMsgServerInfo;
begin
  for I := 0 to m_ServerList.Count - 1 do begin
    MsgServer := m_ServerList.Items[I];
    if MsgServer.Socket = Socket then begin
      Dispose(MsgServer);
      m_ServerList.Delete(I);
      break;
    end;
  end;
end;

procedure TFrmMasSoc.MSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: integer);
begin
  ErrorCode := 0;
  Socket.Close;
end;
//0046611C
procedure TFrmMasSoc.MSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  I:      integer;
  MsgServer: pTMsgServerInfo;
  sReviceMsg: string;
  sMsg:   string;
  sCode:  string;
  sAccount: string;
  sServerName: string;
  sIndex: string;
  sOnlineCount: string;
  nCode:  integer;
  Config: pTConfig;
begin
  Config := @g_Config;
  for I := 0 to m_ServerList.Count - 1 do begin
    MsgServer := m_ServerList.Items[I];
    if MsgServer.Socket = Socket then begin
      sReviceMsg := MsgServer.sReceiveMsg + Socket.ReceiveText;
      while (Pos(')', sReviceMsg) > 0) do begin
        sReviceMsg := ArrestStringEx(sReviceMsg, '(', ')', sMsg);
        if sMsg = '' then break;
        sMsg  := GetValidStr3(sMsg, sCode, ['/']);
        nCode := Str_ToInt(sCode, -1);
        case nCode of
          SS_SOFTOUTSESSION: begin
            sMsg := GetValidStr3(sMsg, sAccount, ['/']);
            CloseUser(Config, sAccount, Str_ToInt(sMsg, 0));
          end;
          SS_SERVERINFO: begin
            sMsg := GetValidStr3(sMsg, sServerName, ['/']);
            sMsg := GetValidStr3(sMsg, sIndex, ['/']);
            sMsg := GetValidStr3(sMsg, sOnlineCount, ['/']);
            MsgServer.sServerName := sServerName;
            MsgServer.nServerIndex := Str_ToInt(sIndex, 0);
            MsgServer.nOnlineCount := Str_ToInt(sOnlineCount, 0);
            MsgServer.dwKeepAliveTick := GetTickCount();
            SortServerList(I);
            nOnlineCountMin := GetOnlineHumCount();
            if nOnlineCountMin > nOnlineCountMax then
              nOnlineCountMax := nOnlineCountMin;
            SendServerMsgA(SS_KEEPALIVE, IntToStr(nOnlineCountMin));
            RefServerLimit(sServerName);
          end;
          UNKNOWMSG: SendServerMsgA(UNKNOWMSG, sMsg);
          else begin
            FrmMain.Memo1.Lines.Add('MsgServer Ident: '+IntToStr(nCode)); //Damian - Debugging purposes
          end;
        end;
      end;
    end;
    MsgServer.sReceiveMsg := sReviceMsg;
  end;
end;

procedure TFrmMasSoc.FormDestroy(Sender: TObject);
begin
  m_ServerList.Free;
end;

//00465CF8
procedure TFrmMasSoc.RefServerLimit(sServerName: string);
var
  I:      integer;
  nCount: integer;
  MsgServer: pTMsgServerInfo;
begin
  try
    nCount := 0;
    for I := 0 to m_ServerList.Count - 1 do begin
      MsgServer := m_ServerList.Items[I];
      if (MsgServer.nServerIndex <> 99) and (MsgServer.sServerName = sServerName) then
        Inc(nCount, MsgServer.nOnlineCount);
    end;
    for I := Low(UserLimit) to High(UserLimit) do begin
      if UserLimit[I].sServerName = sServerName then begin
        UserLimit[I].nLimitCountMin := nCount;
        break;
      end;
    end;
  except
    MainOutMessage('TFrmMasSoc.RefServerLimit');
  end;
end;


//00465E78
function TFrmMasSoc.IsNotUserFull(sServerName: string): boolean;
var
  I: integer;
begin
  Result := True;
  for I := Low(UserLimit) to High(UserLimit) do begin
    if UserLimit[I].sServerName = sServerName then begin
      if UserLimit[I].nLimitCountMin > UserLimit[I].nLimitCountMax then
        Result := False;
      break;
    end;
  end;
end;
//00465F18
procedure TFrmMasSoc.SortServerList(nIndex: integer);
var
  nC, n10, n14:  integer;
  MsgServerSort: pTMsgServerInfo;
  MsgServer:     pTMsgServerInfo;
  nNewIndex:     integer;
begin
  try
    if m_ServerList.Count <= nIndex then exit;
    MsgServerSort := m_ServerList.Items[nIndex];
    m_ServerList.Delete(nIndex);
    for nC := 0 to m_ServerList.Count - 1 do begin
      MsgServer := m_ServerList.Items[nC];
      if MsgServer.sServerName = MsgServerSort.sServerName then begin
        if MsgServer.nServerIndex < MsgServerSort.nServerIndex then begin
          m_ServerList.Insert(nC, MsgServerSort);
          exit;
        end else begin //00465FD8
          nNewIndex := nC + 1;
          if nNewIndex < m_ServerList.Count then begin   //Jacky 增加
            for n10 := nNewIndex to m_ServerList.Count - 1 do begin
              MsgServer := m_ServerList.Items[n10];
              if MsgServer.sServerName = MsgServerSort.sServerName then
              begin
                if MsgServer.nServerIndex < MsgServerSort.nServerIndex then
                begin
                  m_ServerList.Insert(n10, MsgServerSort);
                  for n14 := n10 + 1 to m_ServerList.Count - 1 do begin
                    MsgServer := m_ServerList.Items[n14];
                    if (MsgServer.sServerName = MsgServerSort.sServerName) and
                      (MsgServer.nServerIndex = MsgServerSort.nServerIndex) then
                    begin
                      m_ServerList.Delete(n14);
                      exit;
                    end;
                  end;
                  exit;
                end else begin //004660D1
                  nNewIndex := n10 + 1;
                end;
              end;
            end; //00465FF1
            m_ServerList.Insert(nNewIndex, MsgServerSort);
            exit;
          end;
        end;
      end;
    end;
    m_ServerList.Add(MsgServerSort);
  except
    MainOutMessage('TFrmMasSoc.SortServerList');
  end;
end;


//004665BD
procedure TFrmMasSoc.SendServerMsg(wIdent: word; sServerName, sMsg: string);
var
  I:   integer;
  MsgServer: pTMsgServerInfo;
  sSendMsg: string;
  s18: string;
resourcestring
  sFormatMsg = '(%d/%s)';
begin
  try
    s18      := LimitName(sServerName);
    sSendMsg := format(sFormatMsg, [wIdent, sMsg]);
    for I := 0 to m_ServerList.Count - 1 do begin
      MsgServer := pTMsgServerInfo(m_ServerList.Items[I]);
      if MsgServer.Socket.Connected then begin
        if (s18 = '') or (MsgServer.sServerName = '') or
          (CompareText(MsgServer.sServerName, s18) = 0) or
          (MsgServer.nServerIndex = 99) then begin
          MsgServer.Socket.SendText(sSendMsg);
        end;
      end;
    end;
  except
    MainOutMessage('TFrmMasSoc.SendServerMsg');
  end;
end;
//004659BC
procedure TFrmMasSoc.LoadServerAddr();
var
  sFileName:     string;
  LoadList:      TStringList;
  I, nServerIdx: integer;
  sLineText:     string;
begin
  sFileName  := '.\!ServerAddr.txt';
  nServerIdx := 0;
  FillChar(ServerAddr, SizeOf(ServerAddr), #0);
  if FileExists(sFileName) then begin
    LoadList := TStringList.Create;
    LoadList.LoadFromFile(sFileName);
    for I := 0 to LoadList.Count - 1 do begin
      sLineText := Trim(LoadList.Strings[i]);
      if (sLineText <> '') and (sLineText[I] <> ';') then begin
        if TagCount(sLineText, '.') = 3 then begin
          ServerAddr[nServerIdx] := sLineText;
          Inc(nServerIdx);
          if nServerIdx >= 100 then break;
        end;
      end;
    end;
    LoadList.Free;
  end;
end;


//00466460
function TFrmMasSoc.GetOnlineHumCount(): integer;
var
  i, nCount: integer;
  MsgServer: pTMsgServerInfo;
begin
  Result := 0;
  nCount := 0;

  try
    for i := 0 to m_ServerList.Count - 1 do begin
      MsgServer := m_ServerList.Items[i];
      if MsgServer.nServerIndex <> 99 then Inc(nCount, MsgServer.nOnlineCount);
    end;
    Result := nCount;
  except
    MainOutMessage('TFrmMasSoc.GetOnlineHumCount');
  end;
end;
//00465AD8
function TFrmMasSoc.CheckReadyServers: boolean;
var
  Config: pTConfig;
begin
  Config := @g_Config;
  Result := False;
  if m_ServerList.Count >= Config.nReadyServers then Result := True;
end;

//004664B0
procedure TFrmMasSoc.SendServerMsgA(wIdent: word; sMsg: string);
var
  I: integer;
  sSendMsg: string;
  MsgServer: pTMsgServerInfo;
resourcestring
  sFormatMsg = '(%d/%s)';
begin
  try
    sSendMsg := format(sFormatMsg, [wIdent, sMsg]);
    for I := 0 to m_ServerList.Count - 1 do begin
      MsgServer := pTMsgServerInfo(m_ServerList.Items[I]);
      if MsgServer.Socket.Connected then MsgServer.Socket.SendText(sSendMsg);
    end;
  except
    on e: Exception do begin
      MainOutMessage('TFrmMasSoc.SendServerMsgA');
      MainOutMessage(E.Message);
    end;
  end;
end;
//00465DE0
function TFrmMasSoc.LimitName(sServerName: string): string;
var
  i: integer;
begin
  try
    Result := '';
    for i := Low(UserLimit) to High(UserLimit) do begin
      if CompareText(UserLimit[i].sServerName, sServerName) = 0 then begin
        Result := UserLimit[i].sName;
        break;
      end;
    end;
  except
    MainOutMessage('TFrmMasSoc.LimitName');
  end;
end;
//00465730
procedure TFrmMasSoc.LoadUserLimit();
var
  LoadList:  TStringList;
  sFileName: string;
  i, nC:     integer;
  sLineText, sServerName, s10, s14: string;

begin
  nC := 0;
  sFileName := '.\!UserLimit.txt';
  if FileExists(sFileName) then begin
    LoadList := TStringList.Create;
    LoadList.LoadFromFile(sFileName);
    for i := 0 to LoadList.Count - 1 do begin
      sLineText := LoadList.Strings[i];
      sLineText := GetValidStr3(sLineText, sServerName, [' ', #9]);
      sLineText := GetValidStr3(sLineText, s10, [' ', #9]);
      sLineText := GetValidStr3(sLineText, s14, [' ', #9]);
      if sServerName <> '' then begin
        UserLimit[nC].sServerName := sServerName;
        UserLimit[nC].sName := s10;
        UserLimit[nC].nLimitCountMax := Str_ToInt(s14, 3000);
        UserLimit[nC].nLimitCountMin := 0;
        Inc(nC);
      end;
    end;
    nUserLimit := nC;
    LoadList.Free;
  end else
    ShowMessage('[Critical Failure] file not found. .\!UserLimit.txt');
end;

function TFrmMasSoc.ServerStatus(sServerName: string): integer;
var
  I: integer;
  nStatus: integer;
  MsgServer: pTMsgServerInfo;
  boServerOnLine: boolean;
begin
  nStatus := 0;
  Result := 0;
  boServerOnLine := False;
  
  try
    for I := 0 to m_ServerList.Count - 1 do begin
      MsgServer := m_ServerList.Items[I];
      if (MsgServer.nServerIndex <> 99) and (MsgServer.sServerName = sServerName) then
      begin
        boServerOnLine := True;
      end;
    end;
    if not boServerOnLine then exit;

    for I := Low(UserLimit) to High(UserLimit) do begin
      if UserLimit[I].sServerName = sServerName then begin
        if UserLimit[I].nLimitCountMin <= UserLimit[I].nLimitCountMax div 2 then
        begin
          nStatus := 1; //空閑
          break;
        end;

        if UserLimit[I].nLimitCountMin <= UserLimit[I].nLimitCountMax -
        (UserLimit[I].nLimitCountMax div 5) then begin
          nStatus := 2; //良好
          break;
        end;
        if UserLimit[I].nLimitCountMin < UserLimit[I].nLimitCountMax then begin
          nStatus := 3; //繁忙
          break;
        end;
        if UserLimit[I].nLimitCountMin >= UserLimit[I].nLimitCountMax then begin
          nStatus := 4; //滿員
          break;
        end;
      end;
    end;
    Result := nStatus;
  except
    MainOutMessage('TFrmMasSoc.ServerStatus');
  end;
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产激情偷乱视频一区二区三区| 亚洲一区二区三区三| 午夜av一区二区| 91在线小视频| 日韩欧美在线网站| 亚洲aaa精品| 欧美日韩精品久久久| 中文无字幕一区二区三区| 亚洲va韩国va欧美va精品| 色美美综合视频| 亚洲欧美怡红院| 91首页免费视频| 国产欧美日产一区| 成人三级在线视频| 亚洲丝袜自拍清纯另类| av电影在线不卡| 最新成人av在线| 欧美在线综合视频| 丝袜美腿亚洲色图| 欧美一区二区大片| 国产精品99精品久久免费| 欧美大片日本大片免费观看| 久久99精品久久久久久动态图 | 久久99深爱久久99精品| 91精品国产aⅴ一区二区| 精品无码三级在线观看视频| 日韩欧美的一区二区| 国产乱码精品1区2区3区| 亚洲色图.com| 欧美成人在线直播| 99久久综合精品| 麻豆成人综合网| 亚洲视频香蕉人妖| 欧美tickling挠脚心丨vk| 色综合久久久久综合体桃花网| 视频精品一区二区| 亚洲人吸女人奶水| 久久久久国产精品麻豆| 色av一区二区| 国产成人午夜精品5599| 免费久久精品视频| 国产精品久久99| 精品少妇一区二区三区免费观看| 成人h动漫精品一区二| 性做久久久久久| 亚洲国产一区在线观看| 国产精品美女久久久久久久久 | 国产精品免费丝袜| 日韩精品专区在线| 欧美一区二区三区在线观看视频| 91老师国产黑色丝袜在线| 狠狠色综合色综合网络| 日本va欧美va精品发布| 狠狠久久亚洲欧美| 精品影院一区二区久久久| 美腿丝袜亚洲一区| 激情欧美一区二区三区在线观看| 精品无人码麻豆乱码1区2区| 日韩1区2区3区| 麻豆精品久久精品色综合| 国内精品国产成人国产三级粉色| 经典一区二区三区| 国内一区二区在线| 国产99久久久久| 欧美午夜影院一区| 欧美日韩和欧美的一区二区| 在线免费精品视频| 欧美一区二区大片| 久久夜色精品国产噜噜av| 精品国产乱码久久久久久久久| 精品久久久影院| 亚洲国产精品国自产拍av| 樱花草国产18久久久久| 亚洲6080在线| 国产福利不卡视频| 色美美综合视频| 欧美成人三级在线| 亚洲精品视频自拍| 免费高清不卡av| 99re成人精品视频| 91麻豆精品国产91久久久 | 毛片基地黄久久久久久天堂| 99re热视频精品| 欧美精品一区男女天堂| **性色生活片久久毛片| 韩日av一区二区| 午夜不卡在线视频| 国产成人综合在线观看| 欧美亚洲一区二区在线| 久久久久久久久久久久电影| 亚洲主播在线播放| 成人精品视频一区| 日韩美女主播在线视频一区二区三区| 国产精品另类一区| 国产一区欧美一区| 91精品婷婷国产综合久久竹菊| 亚洲视频在线观看一区| 国产精品99久久久久久久vr | 国产一区二区精品在线观看| 欧美日韩成人激情| 亚洲丶国产丶欧美一区二区三区| 成人教育av在线| 一色桃子久久精品亚洲| 久久精品99国产精品| 成人18精品视频| 国产精品免费av| 国产盗摄精品一区二区三区在线| 欧美一区二区免费视频| 亚洲国产另类精品专区| 3751色影院一区二区三区| 青青草国产精品亚洲专区无| 欧美日韩精品欧美日韩精品一| 性久久久久久久久久久久| 日韩午夜激情视频| 成人久久18免费网站麻豆| 中文字幕一区视频| 欧美视频日韩视频| 天堂在线一区二区| 久久综合九色综合97_久久久| 国产精品影视在线| 亚洲超丰满肉感bbw| 欧美视频第二页| 日韩va欧美va亚洲va久久| 91精品国产综合久久福利软件| 国产一区二区三区综合| 欧美午夜精品一区二区三区| 亚洲午夜电影在线观看| 欧美一区二区三区白人| 国产在线不卡一卡二卡三卡四卡| 国产精品毛片久久久久久久| 欧美日本在线播放| 美女在线视频一区| 久久精品日韩一区二区三区| 91免费观看国产| 蜜臀国产一区二区三区在线播放| 久久久一区二区| 91亚洲资源网| 香港成人在线视频| 国产精品网站在线| 精品三级av在线| 91女神在线视频| 久久福利视频一区二区| 一区二区三区中文在线| 国产精品欧美一区喷水| 日韩三级av在线播放| 91免费版在线| 成人免费看黄yyy456| 日韩精品一二区| 亚洲精品视频观看| 国产精品久久久久久久午夜片 | 亚洲乱码国产乱码精品精98午夜| 制服丝袜日韩国产| 欧美在线制服丝袜| 91国产丝袜在线播放| 国产suv精品一区二区883| 香蕉久久夜色精品国产使用方法 | 麻豆免费精品视频| 亚洲影院理伦片| 午夜私人影院久久久久| 五月激情综合婷婷| 亚洲欧美日韩国产综合在线| 国产精品国产a级| 国产精品美女久久久久久久久 | 成人深夜福利app| 大陆成人av片| 国产专区综合网| 精品一区二区三区影院在线午夜| 久久国产视频网| 99久久精品情趣| av激情成人网| 精品视频在线看| 日韩一级免费观看| 亚洲男同性恋视频| 香蕉成人啪国产精品视频综合网 | 欧美一区二区三区不卡| 国产精品毛片a∨一区二区三区| 国产精品青草久久| 亚洲老司机在线| 香蕉成人伊视频在线观看| 国产福利精品一区二区| 欧美电影一区二区| 国产精品久久久久一区| 午夜精品一区在线观看| 成人性生交大片免费看在线播放| 56国语精品自产拍在线观看| 国产女同互慰高潮91漫画| 午夜免费久久看| 丁香激情综合五月| 久久久99精品免费观看不卡| 一区二区三区在线高清| 韩国一区二区三区| 欧美色窝79yyyycom| 国产精品激情偷乱一区二区∴| 日韩精品综合一本久道在线视频| 国产欧美一区二区在线| 国产成人av福利| 久久一日本道色综合| 午夜婷婷国产麻豆精品| 在线免费亚洲电影| 亚洲日本护士毛茸茸|