📄 dbsmain.~pas
字号:
unit DBSMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, JSocket, Buttons, IniFiles,
Menus,Grobal2;
type
pTServerInfo =^TServerInfo;
TServerInfo = record
nSckHandle :Integer; //0x00
sStr :String; //0x04
bo08 :Boolean; //0x08
Socket :TCustomWinSocket; //0x0C
end;
pTHumSession = ^THumSession;
THumSession = record
sChrName :String[14];
nIndex :Integer;
Socket :TCustomWinSocket; //0x20
bo24 :Boolean;
bo2C :Boolean;
dwTick30 :LongWord;
end;
TFrmDBSrv=class(TForm)
ServerSocket: TServerSocket;
Timer1: TTimer;
AniTimer: TTimer;
StartTimer: TTimer;
Timer2: TTimer;
MemoLog: TMemo;
Panel1: TPanel;
Label1: TLabel;
Label3: TLabel;
Label4: TLabel;
LbAutoClean: TLabel;
Panel2: TPanel;
BtnUserDBTool: TSpeedButton;
LbTransCount: TLabel;
Label2: TLabel;
Label5: TLabel;
Label6: TLabel;
LbUserCount: TLabel;
BtnReloadAddr: TButton;
BtnEditAddrs: TButton;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
CkViewHackMsg: TCheckBox;
MainMenu: TMainMenu;
MENU_CONTROL: TMenuItem;
V1: TMenuItem;
MENU_OPTION: TMenuItem;
MENU_MANAGE: TMenuItem;
MENU_OPTION_GENERAL: TMenuItem;
MENU_OPTION_GAMEGATE: TMenuItem;
MENU_CONTROL_START: TMenuItem;
MENU_CONTROL_STOP: TMenuItem;
N1: TMenuItem;
G1: TMenuItem;
MENU_MANAGE_DATA: TMenuItem;
MENU_MANAGE_TOOL: TMenuItem;
MENU_TEST: TMenuItem;
MENU_TEST_SELGATE: TMenuItem;
Exit1: TMenuItem;
procedure Timer1Timer(Sender : TObject);
procedure FormCreate(Sender : TObject);
procedure FormDestroy(Sender : TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure AniTimerTimer(Sender : TObject);
procedure FormShow(Sender : TObject);
procedure StartTimerTimer(Sender : TObject);
procedure Timer2Timer(Sender : TObject);
procedure BtnUserDBToolClick(Sender : TObject);
procedure BtnReloadAddrClick(Sender : TObject);
procedure BtnEditAddrsClick(Sender : TObject);
procedure CkViewHackMsgClick(Sender : TObject);
procedure WriteLogMsg(sMsg:String);
procedure OutMainMessageA(sMsg:String);
procedure ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure MENU_MANAGE_DATAClick(Sender: TObject);
procedure MENU_MANAGE_TOOLClick(Sender: TObject);
procedure V1Click(Sender: TObject);
procedure MENU_TEST_SELGATEClick(Sender: TObject);
procedure MENU_CONTROL_STARTClick(Sender: TObject);
procedure Exit1Click(Sender: TObject);
private
n334:Integer;
m_DefMsg:TDefaultMessage;
n344:integer;
n348:integer;
s34C:String;
ServerList:TList; //0x354
HumSessionList:TList; //0x358
m_boRemoteClose:Boolean;
procedure MainOutMessage(sMsg:String);
procedure ProcessServerPacket(ServerInfo: pTServerInfo);
procedure ProcessServerMsg(sMsg: String; nLen: Integer;
Socket: TCustomWinSocket);
procedure SendSocket(Socket: TCustomWinSocket; sMsg: String);
procedure LoadHumanRcd(sMsg: String; Socket: TCustomWinSocket);
procedure SaveHumanRcd(nRecog: Integer;sMsg: String;
Socket: TCustomWinSocket);
procedure SaveHumanRcdEx(sMsg: String; nRecog: Integer;
Socket: TCustomWinSocket);
procedure ClearSocket(Socket:TCustomWinSocket);
{ Private declarations }
public
function CopyHumData(sSrcChrName,sDestChrName,sUserID:String):Boolean;
procedure DelHum(sChrName:String);
procedure MyMessage(var MsgData:TWmCopyData);message WM_COPYDATA;
{ Public declarations }
end;
var
FrmDBSrv: TFrmDBSrv;
implementation
uses HumDB, DBShare, FIDHum, UsrSoc, AddrEdit, HUtil32, EDcode,
IDSocCli, DBTools, TestSelGate, RouteManage;
{$R *.DFM}
procedure TFrmDBSrv.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
ServerInfo: pTServerInfo;
sIPaddr:String;
begin
sIPaddr:=Socket.RemoteAddress;
if not CheckServerIP(sIPaddr) then begin
OutMainMessage('非法服务器连接: ' + sIPaddr);
Socket.Close;
exit;
end;
if not boOpenDBBusy then begin
New(ServerInfo);
ServerInfo.bo08:=True;
ServerInfo.nSckHandle:=Socket.SocketHandle;
ServerInfo.sStr:='';
ServerInfo.Socket:=Socket;
ServerList.Add(ServerInfo);
end else begin
Socket.Close;
end;
end;
procedure TFrmDBSrv.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i:Integer;
ServerInfo: pTServerInfo;
begin
for i:=0 to ServerList.Count -1 do begin
ServerInfo:=ServerList.Items[i];
if ServerInfo.nSckHandle = Socket.SocketHandle then begin
Dispose(ServerInfo);
ServerList.Delete(i);
ClearSocket(Socket);
break;
end;
end;
end;
procedure TFrmDBSrv.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close;
end;
procedure TFrmDBSrv.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i:integer;
ServerInfo: pTServerInfo;
s10:String;
begin
g_CheckCode.dwThread0:=1001000;
for i:=0 to ServerList.Count -1 do begin
g_CheckCode.dwThread0:=1001001;
ServerInfo:=ServerList.Items[i];
g_CheckCode.dwThread0:=1001002;
if ServerInfo.nSckHandle = Socket.SocketHandle then begin
g_CheckCode.dwThread0:=1001003;
s10:=Socket.ReceiveText;
Inc(n4ADBF4);
if s10 <> '' then begin
g_CheckCode.dwThread0:=1001004;
ServerInfo.sStr:=ServerInfo.sStr + s10;
g_CheckCode.dwThread0:=1001005;
if Pos('!',s10) > 0 then begin
g_CheckCode.dwThread0:=1001006;
ProcessServerPacket(ServerInfo);
g_CheckCode.dwThread0:=1001007;
Inc(n4ADBF8);
Inc(n348);
Break;
end else begin//004A7DC7
if Length(ServerInfo.sStr) > 81920 then begin
ServerInfo.sStr:='';
Inc(n4ADC2C);
end;
end;
end;
Break;
end;
end;
g_CheckCode.dwThread0:=1001008;
end;
procedure TFrmDBSrv.ProcessServerPacket(ServerInfo:pTServerInfo);
var
bo25:Boolean;
sC,s1C,s20,s24:String;
n14,n18:Integer;
wE,w10:Word;
DefMsg:TDefaultMessage;
begin
g_CheckCode.dwThread0:=1001100;
if boOpenDBBusy then exit;
try
bo25:=False;
s1C:=ServerInfo.sStr;
ServerInfo.sStr:='';
s20:='';
g_CheckCode.dwThread0:=1001101;
s1C:=ArrestStringEx(s1C,'#','!',s20);
g_CheckCode.dwThread0:=1001102;
if s20 <> '' then begin
g_CheckCode.dwThread0:=1001103;
s20:=GetValidStr3(s20,s24,['/']);
n14:=length(s20);
if (n14 >= DEFBLOCKSIZE) and (s24 <> '') then begin
wE:=Str_ToInt(s24,0) xor 170;
w10:=n14;
n18:=MakeLong(wE,w10);
sC:=EncodeBuffer(@n18,SizeOf(Integer));
s34C:=s24;
if CompareBackLStr(s20,sC,Length(sC)) then begin
g_CheckCode.dwThread0:=1001104;
ProcessServerMsg(s20,n14,ServerInfo.Socket);
g_CheckCode.dwThread0:=1001105;
bo25:=True;
end;
end; //0x004A7F7B
end; //0x004A7F7B
if s1C <> '' then begin
Inc(n4ADC00);
Label4.Caption:='Error ' + IntToStr(n4ADC00);
end; //0x004A7FB5
if not bo25 then begin
m_DefMsg:=MakeDefaultMsg(DBR_FAIL,0,0,0,0);
{
DefMsg:=MakeDefaultMsg(DBR_FAIL,0,0,0,0);
n338:=DefMsg.Recog;
n33C:=DefMsg.Ident;
n340:=DefMsg.Tag;
}
SendSocket(ServerInfo.Socket,EncodeMessage(m_DefMsg));
Inc(n4ADC00);
Label4.Caption:='Error ' + IntToStr(n4ADC00);
end; //0x004A8048
finally
end;
g_CheckCode.dwThread0:=1001106;
end;
procedure TFrmDBSrv.SendSocket(Socket:TCustomWinSocket;sMsg:String);//0x004A8764
var
n10:Integer;
s18:String;
begin
Inc(n4ADBFC);
n10:=MakeLong(Str_ToInt(s34C,0) xor 170,Length(sMsg) + 6);
s18:=EncodeBuffer(@n10,SizeOf(Integer));
Socket.SendText('#' + s34C + '/' + sMsg + s18 + '!')
end;
procedure TFrmDBSrv.ProcessServerMsg(sMsg:String;nLen:Integer;Socket:TCustomWinSocket);//0x004A9278
var
sDefMsg,sData:String;
DefMsg:TDefaultMessage;
begin
if nLen = DEFBLOCKSIZE then begin
sDefMsg:=sMsg;
sData:='';
end else begin
sDefMsg:=Copy(sMsg,1,DEFBLOCKSIZE);
sData:=Copy(sMsg,DEFBLOCKSIZE + 1, Length(sMsg)- DEFBLOCKSIZE - 6);
end; //0x004A9304
DefMsg:=DecodeMessage(sDefMsg);
case DefMsg.Ident of
DB_LOADHUMANRCD: begin
LoadHumanRcd(sData,Socket);
end;
DB_SAVEHUMANRCD: begin
SaveHumanRcd(DefMsg.Recog,sData,Socket);
end;
DB_SAVEHUMANRCDEX: begin
SaveHumanRcdEx(sData,DefMsg.Recog,Socket);
end;
else begin
m_DefMsg:=MakeDefaultMsg(DBR_FAIL,0,0,0,0);
SendSocket(Socket,EncodeMessage(m_DefMsg));
Inc(n4ADC04);
end;
end;
g_CheckCode.dwThread0:=1001216;
end;
procedure TFrmDBSrv.LoadHumanRcd(sMsg:String;Socket:TCustomWinSocket);
var
sHumName :String;
sAccount :String;
sIPaddr :String;
nIndex :Integer;
nSessionID :Integer;
nCheckCode :Integer;
DefMsg :TDefaultMessage;
HumanRCD,HumanRCD2 :THumDataInfo;
LoadHuman :TLoadHuman;
boFoundSession :Boolean;
begin
DecodeBuffer(sMsg,@LoadHuman,SizeOf(TLoadHuman));
sAccount:=LoadHuman.sAccount;
sHumName:=LoadHuman.sChrName;
sIPaddr:=LoadHuman.sUserAddr;
nSessionID:=LoadHuman.nSessionID;
nCheckCode:= -1;
if (sAccount <> '') and (sHumName <> '') then begin
if (FrmIDSoc.CheckSessionLoadRcd(sAccount,sIPaddr,nSessionID,boFoundSession)) then begin
nCheckCode:= 1;
end else begin
if boFoundSession then begin
OutMainMessage('[非法重复请求] ' + '帐号: ' + sAccount + ' IP: ' + sIPaddr + ' 标识: ' + IntToStr(nSessionID));
end else begin
OutMainMessage('[非法请求] ' + '帐号: ' + sAccount + ' IP: ' + sIPaddr + ' 标识: ' + IntToStr(nSessionID));
end;
//nCheckCode:= 1; //测试用,正常去掉
end;
end;
if nCheckCode = 1 then begin
try
if HumDataDB.OpenEx then begin
nIndex:=HumDataDB.Index(sHumName);
if nIndex >= 0 then begin
if HumDataDB.Get(nIndex,HumanRCD) < 0 then nCheckCode:= -2;
end else nCheckCode:= -3;
end else nCheckCode:= -4;
finally
HumDataDB.Close();
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -