📄 main.pas
字号:
var
UserSession: pTUserSession;
nIndex: Integer;
begin
for nIndex := 0 to GATEMAXSESSION - 1 do begin
UserSession := @g_SessionArray[nIndex];
UserSession.Socket := nil;
UserSession.sRemoteIPaddr := '';
UserSession.SocketHandle := -1;
UserSession.MsgList.Clear;
end;
end;
procedure TFrmMain.IniUserSessionArray();
var
UserSession: pTUserSession;
nIndex: Integer;
begin
for nIndex := 0 to GATEMAXSESSION - 1 do begin
UserSession := @g_SessionArray[nIndex];
UserSession.Socket := nil;
UserSession.sRemoteIPaddr := '';
UserSession.nSendMsgLen := 0;
UserSession.bo0C := False;
UserSession.dw10Tick := GetTickCount();
UserSession.boSendAvailable := True;
UserSession.boSendCheck := False;
UserSession.nCheckSendLength := 0;
UserSession.n20 := 0;
UserSession.dwUserTimeOutTick := GetTickCount();
UserSession.SocketHandle := -1;
UserSession.nReceiveMsgLen := 0;
UserSession.dwReceiveTick := GetTickCount();
UserSession.MsgList := TStringList.Create;
end;
end;
procedure TFrmMain.StartTimerTimer(Sender: TObject);
begin
if boStarted then begin
StartTimer.Enabled := False;
StopService();
boClose := True;
Close;
end else begin
MENU_VIEW_LOGMSGClick(Sender);
boStarted := True;
StartTimer.Enabled := False;
StartService();
end;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
var
nX, nY: Integer;
begin
g_dwGameCenterHandle := Str_ToInt(ParamStr(1), 0);
nX := Str_ToInt(ParamStr(2), -1);
nY := Str_ToInt(ParamStr(3), -1);
if (nX >= 0) or (nY >= 0) then begin
Left := nX;
Top := nY;
end;
TempLogList := TStringList.Create;
StringList30C := TStringList.Create;
StringList318 := TStringList.Create;
dwDecodeMsgTime := 0;
SendGameCenterMsg(SG_FORMHANDLE, IntToStr(Self.Handle));
IniUserSessionArray();
end;
procedure TFrmMain.MENU_CONTROL_STARTClick(Sender: TObject);
begin
StartService();
end;
procedure TFrmMain.MENU_CONTROL_STOPClick(Sender: TObject);
begin
if Application.MessageBox('是否确认停止服务?',
'确认信息',
MB_YESNO + MB_ICONQUESTION) = IDYES then
StopService();
end;
procedure TFrmMain.MENU_CONTROL_RECONNECTClick(Sender: TObject);
begin
dwReConnectServerTick := 0;
end;
procedure TFrmMain.MENU_CONTROL_CLEAELOGClick(Sender: TObject);
begin
if Application.MessageBox('是否确认清除显示的日志信息?',
'确认信息',
MB_OKCANCEL + MB_ICONQUESTION
) <> IDOK then Exit;
MemoLog.Clear;
end;
procedure TFrmMain.MENU_CONTROL_EXITClick(Sender: TObject);
begin
Close;
end;
procedure TFrmMain.MENU_VIEW_LOGMSGClick(Sender: TObject);
begin
MENU_VIEW_LOGMSG.Checked := not MENU_VIEW_LOGMSG.Checked;
ShowLogMsg(MENU_VIEW_LOGMSG.Checked);
end;
procedure TFrmMain.ShowLogMsg(boFlag: Boolean);
var
nHeight: Integer;
begin
case boFlag of
True: begin
nHeight := Panel.Height;
Panel.Height := 0;
MemoLog.Height := nHeight;
MemoLog.Top := Panel.Top;
end;
False: begin
nHeight := MemoLog.Height;
MemoLog.Height := 0;
Panel.Height := nHeight;
end;
end;
end;
procedure TFrmMain.MENU_OPTION_GENERALClick(Sender: TObject);
begin
frmGeneralConfig.Top := Self.Top + 20;
frmGeneralConfig.Left := Self.Left;
with frmGeneralConfig do begin
EditGateIPaddr.Text := GateAddr;
EditGatePort.Text := IntToStr(GatePort);
EditServerIPaddr.Text := ServerAddr;
EditServerPort.Text := IntToStr(ServerPort);
EditTitle.Text := TitleName;
TrackBarLogLevel.Position := nShowLogLevel;
end;
frmGeneralConfig.ShowModal;
end;
procedure TFrmMain.CloseConnect(sIPaddr: string);
var
I: Integer;
boCheck: Boolean;
begin
if ServerSocket.Active then
while (True) do begin
boCheck := False;
for I := 0 to ServerSocket.Socket.ActiveConnections - 1 do begin
if sIPaddr = ServerSocket.Socket.Connections[I].RemoteAddress then begin
ServerSocket.Socket.Connections[I].Close;
boCheck := True;
break;
end;
end;
if not boCheck then break;
end;
end;
procedure TFrmMain.MENU_OPTION_IPFILTERClick(Sender: TObject);
var
I: Integer;
sIPaddr: string;
begin
frmIPaddrFilter.Top := Self.Top + 20;
frmIPaddrFilter.Left := Self.Left;
frmIPaddrFilter.ListBoxActiveList.Clear;
frmIPaddrFilter.ListBoxTempList.Clear;
frmIPaddrFilter.ListBoxBlockList.Clear;
if ServerSocket.Active then
for I := 0 to ServerSocket.Socket.ActiveConnections - 1 do begin
sIPaddr := ServerSocket.Socket.Connections[I].RemoteAddress;
if sIPaddr <> '' then
frmIPaddrFilter.ListBoxActiveList.Items.AddObject(sIPaddr, TObject(ServerSocket.Socket.Connections[I]));
end;
for I := 0 to TempBlockIPList.Count - 1 do begin
frmIPaddrFilter.ListBoxTempList.Items.Add(StrPas(inet_ntoa(TInAddr(pTSockaddr(TempBlockIPList.Items[I]).nIPaddr))));
end;
for I := 0 to BlockIPList.Count - 1 do begin
frmIPaddrFilter.ListBoxBlockList.Items.Add(StrPas(inet_ntoa(TInAddr(pTSockaddr(BlockIPList.Items[I]).nIPaddr))));
end;
frmIPaddrFilter.TrackBarAttack.Position := nAttackLevel;
frmIPaddrFilter.EditMaxConnect.Value := nMaxConnOfIPaddr;
case BlockMethod of
mDisconnect: frmIPaddrFilter.RadioDisConnect.Checked := True;
mBlock: frmIPaddrFilter.RadioAddTempList.Checked := True;
mBlockList: frmIPaddrFilter.RadioAddBlockList.Checked := True;
end;
frmIPaddrFilter.ShowModal;
end;
function TFrmMain.IsBlockIP(sIPaddr: string): Boolean;
var
I: Integer;
IPaddr: pTSockaddr;
nIPaddr: Integer;
begin
Result := False;
TempBlockIPList.Lock;
try
nIPaddr := inet_addr(PChar(sIPaddr));
for I := 0 to TempBlockIPList.Count - 1 do begin
IPaddr := pTSockaddr(TempBlockIPList.Items[I]);
if IPaddr.nIPaddr = nIPaddr then begin
Result := True;
break;
end;
end;
finally
TempBlockIPList.UnLock;
end;
//-------------------------------
if not Result then begin
BlockIPList.Lock;
try
for I := 0 to BlockIPList.Count - 1 do begin
IPaddr := pTSockaddr(BlockIPList.Items[I]);
if IPaddr.nIPaddr = nIPaddr then begin
Result := True;
break;
end;
end;
finally
BlockIPList.UnLock;
end;
end;
end;
function TFrmMain.AddBlockIP(sIPaddr: string): Integer;
var
I: Integer;
IPaddr: pTSockaddr;
nIPaddr: Integer;
begin
BlockIPList.Lock;
try
Result := 0;
nIPaddr := inet_addr(PChar(sIPaddr));
for I := 0 to BlockIPList.Count - 1 do begin
IPaddr := pTSockaddr(BlockIPList.Items[I]);
if IPaddr.nIPaddr = nIPaddr then begin
Result := BlockIPList.Count;
break;
end;
end;
if Result <= 0 then begin
New(IPaddr);
IPaddr^.nIPaddr := nIPaddr;
BlockIPList.Add(IPaddr);
Result := BlockIPList.Count;
end;
finally
BlockIPList.UnLock;
end;
end;
function TFrmMain.AddTempBlockIP(sIPaddr: string): Integer;
var
I: Integer;
IPaddr: pTSockaddr;
nIPaddr: Integer;
begin
TempBlockIPList.Lock;
try
Result := 0;
nIPaddr := inet_addr(PChar(sIPaddr));
for I := 0 to TempBlockIPList.Count - 1 do begin
IPaddr := pTSockaddr(TempBlockIPList.Items[I]);
if IPaddr.nIPaddr = nIPaddr then begin
Result := TempBlockIPList.Count;
break;
end;
end;
if Result <= 0 then begin
New(IPaddr);
IPaddr^.nIPaddr := nIPaddr;
TempBlockIPList.Add(IPaddr);
Result := TempBlockIPList.Count;
end;
finally
TempBlockIPList.UnLock;
end;
end;
function TFrmMain.AddAttackIP(sIPaddr: string): Boolean;
var
I: Integer;
IPaddr, AddIPaddr: pTSockaddr;
nIPaddr: Integer;
bo01: Boolean;
begin
AttackIPaddrList.Lock;
try
Result := False;
if nAttackLevel > 0 then begin
bo01 := False;
nIPaddr := inet_addr(PChar(sIPaddr));
for I := AttackIPaddrList.Count - 1 downto 0 do begin
IPaddr := pTSockaddr(AttackIPaddrList.Items[I]);
if IPaddr.nIPaddr = nIPaddr then begin
if (GetTickCount - IPaddr.dwStartAttackTick) <= dwAttackTick * nAttackLevel then begin
IPaddr.dwStartAttackTick := GetTickCount;
Inc(IPaddr.nAttackCount);
//MainOutMessage('IPaddr.nAttackCount: '+IntToStr(IPaddr.nAttackCount), 0);
if IPaddr.nAttackCount >= nAttackCount * nAttackLevel then begin
Dispose(IPaddr);
AttackIPaddrList.Delete(I);
Result := True;
end;
end else begin
if IPaddr.nAttackCount > nAttackCount * nAttackLevel then begin
Result := True;
end;
Dispose(IPaddr);
AttackIPaddrList.Delete(I);
end;
bo01 := True;
break;
end;
end;
if not bo01 then begin
New(AddIPaddr);
FillChar(AddIPaddr^, SizeOf(TSockaddr), 0);
AddIPaddr^.nIPaddr := nIPaddr;
AddIPaddr^.dwStartAttackTick := GetTickCount;
AddIPaddr^.nAttackCount := 0;
AttackIPaddrList.Add(AddIPaddr);
end;
end;
finally
AttackIPaddrList.UnLock;
end;
end;
function TFrmMain.IsConnLimited(sIPaddr: string): Boolean;
var
I: Integer;
IPaddr, AttackIPaddr: pTSockaddr;
nIPaddr: Integer;
bo01: Boolean;
IPList: TList;
begin
CurrIPaddrList.Lock;
try
Result := False;
if nAttackLevel > 0 then begin
bo01 := False;
nIPaddr := inet_addr(PChar(sIPaddr));
for I := 0 to CurrIPaddrList.Count - 1 do begin
IPList := TList(CurrIPaddrList.Items[I]);
if IPList <> nil then begin
IPaddr := pTSockaddr(IPList.Items[0]);
if IPaddr <> nil then begin
if IPaddr.nIPaddr = nIPaddr then begin
bo01 := True;
Result := AddAttackIP(sIPaddr);
New(AttackIPaddr);
FillChar(AttackIPaddr^, SizeOf(TSockaddr), 0);
AttackIPaddr^.nIPaddr := nIPaddr;
IPList.Add(AttackIPaddr);
if IPList.Count > nMaxConnOfIPaddr * nAttackLevel then Result := True;
break;
end;
end;
end;
end;
if not bo01 then begin
IPList := nil;
New(IPaddr);
FillChar(IPaddr^, SizeOf(TSockaddr), 0);
IPaddr^.nIPaddr := nIPaddr;
IPList := TList.Create;
IPList.Add(IPaddr);
CurrIPaddrList.Add(IPList);
end;
end;
finally
CurrIPaddrList.UnLock;
end;
end;
procedure TFrmMain.ShowMainLogMsg;
var
I: Integer;
begin
if (GetTickCount - dwShowMainLogTick) < 200 then Exit;
dwShowMainLogTick := GetTickCount();
try
boShowLocked := True;
try
CS_MainLog.Enter;
for I := 0 to MainLogMsgList.Count - 1 do begin
TempLogList.Add(MainLogMsgList.Strings[I]);
end;
MainLogMsgList.Clear;
finally
CS_MainLog.Leave;
end;
for I := 0 to TempLogList.Count - 1 do begin
MemoLog.Lines.Add(TempLogList.Strings[I]);
end;
TempLogList.Clear;
finally
boShowLocked := False;
end;
end;
procedure TFrmMain.MyMessage(var MsgData: TWmCopyData);
var
sData: string;
wIdent: Word;
begin
wIdent := HiWord(MsgData.From);
sData := StrPas(MsgData.CopyDataStruct^.lpData);
case wIdent of
GS_QUIT: begin
if boServiceStart then begin
StartTimer.Enabled := True;
end else begin
boClose := True;
Close();
end;
end;
1: ;
2: ;
3: ;
end;
end;
procedure TFrmMain.I1Click(Sender: TObject);
begin
MainOutMessage(g_sProductName, 0);
MainOutMessage(g_sUpDateTime, 0);
MainOutMessage(g_sProgram, 0);
MainOutMessage(g_sWebSite, 0);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -