📄 main.pas
字号:
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.FormCreate(Sender: TObject);
begin
TempLogList := TStringList.Create;
dwLoopCheckTick := GetTickCount();
dwCheckServerTick:=GetTickCount();
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
BlockIPList.SaveToFile('.\BlockIPList.txt');
TempLogList.Free;
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.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.TimerTimer(Sender: TObject);
begin
if ServerSocket.Active then
begin
StatusBar.Panels[0].Text := IntToStr(ServerSocket.Port);
POPMENU_PORT.Caption := IntToStr(ServerSocket.Port);
if boSendHoldTimeOut then
begin
StatusBar.Panels[2].Text := IntToStr(SessionCount) + '/#' +
IntToStr(ServerSocket.Socket.ActiveConnections);
POPMENU_CONNCOUNT.Caption := IntToStr(SessionCount) + '/#' +
IntToStr(ServerSocket.Socket.ActiveConnections);
end
else
begin
StatusBar.Panels[2].Text := IntToStr(SessionCount) + '/' +
IntToStr(ServerSocket.Socket.ActiveConnections);
POPMENU_CONNCOUNT.Caption := IntToStr(SessionCount) + '/' +
IntToStr(ServerSocket.Socket.ActiveConnections);
end;
end
else
begin
StatusBar.Panels[0].Text := '????';
StatusBar.Panels[2].Text := '????';
POPMENU_CONNCOUNT.Caption := '????';
end;
end;
procedure TFrmMain.RestSessionArray;
var
i : Integer;
tSession : pTSessionInfo;
begin
for i := 0 to GATEMAXSESSION - 1 do
begin
tSession := @SessionArray[i];
tSession.Socket := nil;
tSession.sSocData := '';
tSession.sSendData := '';
tSession.nUserListIndex := 0;
tSession.nPacketIdx := -1;
tSession.nPacketErrCount := 0;
tSession.boStartLogon := True;
tSession.boSendLock := False;
tSession.boOverNomSize := False;
tSession.nOverNomSizeCount := 0;
tSession.dwSendLatestTime := GetTickCount();
tSession.boSendAvailable := True;
tSession.boSendCheck := False;
tSession.nCheckSendLength := 0;
tSession.nReceiveLength := 0;
tSession.dwReceiveTick := GetTickCount();
tSession.nSckHandle := -1;
tSession.dwSayMsgTick := GetTickCount();
end;
end;
procedure TFrmMain.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
nSockIdx : Integer;
sRemoteIPaddr : string;
UserSession : pTSessionInfo;
begin
Socket.nIndex := -1;
sRemoteIPaddr := Socket.RemoteAddress;
if IsBlockIP(sRemoteIPaddr) then
begin
AddMainLogMsg('CC攻击连接: ' + sRemoteIPaddr, 5);
Socket.Close;
exit;
end;
if boGateReady then
begin
try
for nSockIdx := 0 to GATEMAXSESSION - 1 do
begin
UserSession := @SessionArray[nSockIdx];
if UserSession.Socket = nil then
begin
UserSession.Socket := Socket;
UserSession.sSocData := '';
UserSession.sSendData := '';
UserSession.nUserListIndex := 0;
UserSession.nPacketIdx := -1;
UserSession.nPacketErrCount := 0;
UserSession.boStartLogon := True;
UserSession.boSendLock := False;
UserSession.dwSendLatestTime := GetTickCount();
UserSession.boSendAvailable := True;
UserSession.boSendCheck := False;
UserSession.nCheckSendLength := 0;
UserSession.nReceiveLength := 0;
UserSession.dwReceiveTick := GetTickCount();
UserSession.nSckHandle := Socket.SocketHandle;
UserSession.sRemoteAddr := sRemoteIPaddr;
UserSession.boOverNomSize := False;
UserSession.nOverNomSizeCount := 0;
UserSession.dwSayMsgTick := GetTickCount();
Socket.nIndex := nSockIdx;
Inc(SessionCount);
break;
end;
end;
finally
end;
if nSockIdx < GATEMAXSESSION then
begin
SendServerMsg(GM_OPEN, nSockIdx, Socket.SocketHandle, 0,
Length(Socket.RemoteAddress) + 1, PChar(Socket.RemoteAddress));
Socket.nIndex := nSockIdx;
AddMainLogMsg('开始连接: ' + sRemoteIPaddr, 5);
end
else
begin
Socket.nIndex := -1;
Socket.Close;
AddMainLogMsg('禁止连接: ' + sRemoteIPaddr, 1);
end;
end
else
begin
Socket.nIndex := -1;
Socket.Close;
AddMainLogMsg('禁止连接: ' + sRemoteIPaddr, 1);
end;
end;
procedure TFrmMain.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
nSockIndex : Integer;
sRemoteAddr : string;
UserSession : pTSessionInfo;
begin
sRemoteAddr := Socket.RemoteAddress;
nSockIndex := Socket.nIndex;
if (nSockIndex >= 0) and (nSockIndex < GATEMAXSESSION) then
begin
UserSession := @SessionArray[nSockIndex];
UserSession.Socket := nil;
UserSession.nSckHandle := -1;
UserSession.sSocData := '';
UserSession.sSendData := '';
Socket.nIndex := -1;
Dec(SessionCount);
if boGateReady then
begin
SendServerMsg(GM_CLOSE, 0, Socket.SocketHandle, 0, 0, nil);
AddMainLogMsg('断开连接: ' + Socket.RemoteAddress, 5);
end;
end;
end;
procedure TFrmMain.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
// AddMainLogMsg('连接错误: ' + Socket.RemoteAddress,2);
ErrorCode := 0;
Socket.Close;
end;
procedure TFrmMain.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
dwProcessMsgTick, dwProcessMsgTime : LongWord;
nReviceLen : Integer;
sReviceMsg : string;
sRemoteAddress : string;
nSocketIndex : Integer;
nPos : Integer;
UserData : pTSendUserData;
nMsgCount : Integer;
UserSession : pTSessionInfo;
begin
try
dwProcessMsgTick := GetTickCount();
//nReviceLen:=Socket.ReceiveLength;
sRemoteAddress := Socket.RemoteAddress;
nSocketIndex := Socket.nIndex;
sReviceMsg := Socket.ReceiveText;
nReviceLen := Length(sReviceMsg);
if (nSocketIndex >= 0) and (nSocketIndex < GATEMAXSESSION) and (sReviceMsg <>
'') and boServerReady then
begin
if nReviceLen > nNomClientPacketSize then
begin
nMsgCount := TagCount(sReviceMsg, '!');
nPos := Pos('HTTP/', sReviceMsg);
if (nMsgCount > nMaxClientMsgCount) or
(nReviceLen > nMaxClientPacketSize)or(npos>0) then
begin
if bokickOverPacketSize then
begin
case BlockMethod of //
mDisconnect:
begin
end;
mBlock:
begin
TempBlockIPList.Add(sRemoteAddress);
CloseConnect(sRemoteAddress);
end;
mBlockList:
begin
BlockIPList.Add(sRemoteAddress);
CloseConnect(sRemoteAddress);
end;
end;
AddMainLogMsg('踢除连接: IP(' + sRemoteAddress + '),信息数量(' +
IntToStr(nMsgCount) + '),数据包长度(' + IntToStr(nReviceLen) + ')',
1);
Socket.Close;
end;
exit;
end;
end;
Inc(nReviceMsgSize, Length(sReviceMsg));
if boShowSckData then
AddMainLogMsg(sReviceMsg, 0);
UserSession := @SessionArray[nSocketIndex];
if UserSession.Socket = Socket then
begin
nPos := Pos('*', sReviceMsg);
if nPos > 0 then
begin
UserSession.boSendAvailable := True;
UserSession.boSendCheck := False;
UserSession.nCheckSendLength := 0;
UserSession.dwReceiveTick := GetTickCount();
sReviceMsg := Copy(sReviceMsg, 1, nPos - 1) + Copy(sReviceMsg, nPos +
1, Length(sReviceMsg));
end; //00456DD0
if (sReviceMsg <> '') and boGateReady and not boCheckServerFail then
begin
New(UserData);
UserData.nSocketIdx := nSocketIndex;
UserData.nSocketHandle := Socket.SocketHandle;
UserData.sMsg := sReviceMsg;
ReviceMsgList.Add(UserData);
end; //00456E2A
end;
end;
dwProcessMsgTime := GetTickCount - dwProcessMsgTick;
if dwProcessMsgTime > dwProcessClientMsgTime then
dwProcessClientMsgTime := dwProcessMsgTime;
except
AddMainLogMsg('[Exception] ClientRead', 1);
end;
end;
procedure TFrmMain.MemoLogChange(Sender: TObject);
begin
if MemoLog.Lines.Count > 500 then
MemoLog.Clear;
end;
procedure TFrmMain.SendTimerTimer(Sender: TObject);
var
i : Integer;
UserSession : pTSessionInfo;
begin
if (GetTickCount - dwSendHoldTick) > 3000 then
begin
boSendHoldTimeOut := False;
end; //457195
if boGateReady and not boCheckServerFail then
begin
for i := 0 to GATEMAXSESSION - 1 do
begin
UserSession := @SessionArray[i];
if UserSession.Socket <> nil then
begin
if (GetTickCount - UserSession.dwReceiveTick) > dwSessionTimeOutTime
then
begin
UserSession.Socket.Close;
UserSession.Socket := nil;
UserSession.nSckHandle := -1;
end;
end;
end;
end; //0045722F
if not boGateReady then
begin
StatusBar.Panels[1].Text := '未连接';
StatusBar.Panels[3].Text := '????';
POPMENU_CHECKTICK.Caption := '????';
if ((GetTickCount - dwReConnectServerTime) > 1000 {30 * 1000}) and
boServiceStart then
begin
dwReConnectServerTime := GetTickCount();
ClientSocket.Active := False;
ClientSocket.Address := ServerAddr;
ClientSocket.Port := ServerPort;
ClientSocket.Active := True;
end;
end
else
begin //00457302
if boCheckServerFail then
begin
StatusBar.Panels[1].Text := '超时';
end
else
begin //00457320
StatusBar.Panels[1].Text := '已连接';
LbLack.Caption := IntToStr(n45AA84) + '/' + IntToStr(n45AA80);
end;
dwCheckServerTimeMin := GetTickCount - dwCheckServerTick;
if dwCheckServerTimeMax < dwCheckServerTimeMin then
dwCheckServerTimeMax := dwCheckServerTimeMin;
StatusBar.Panels[3].Text := IntToStr(dwCheckServerTimeMin) + '/' +
IntToStr(dwCheckServerTimeMax);
POPMENU_CHECKTICK.Caption := IntToStr(dwCheckServerTimeMin) + '/' +
IntToStr(dwCheckServerTimeMax);
end;
end;
procedure TFrmMain.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
//00454C08
begin
boGateReady := True;
dwCheckServerTick := GetTickCount();
dwCheckRecviceTick := GetTickCount();
RestSessionArray();
boServerReady := True;
dwCheckServerTimeMax := 0;
dwCheckServerTimeMax := 0;
end;
procedure TFrmMain.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
//00454CA8
var
i : Integer;
UserSession : pTSessionInfo;
begin
for i := 0 to GATEMAXSESSION - 1 do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -