📄 main.pas
字号:
CanClose:=False;
end;
end else CanClose:=False;
end;
procedure TFrmMain.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
boGateReady := True;
nSessionCount := 0;
dwKeepAliveTick := GetTickCount();
ResUserSessionArray();
boServerReady := True;
end;
procedure TFrmMain.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
UserSession:pTUserSession;
nIndex:Integer;
begin
for nIndex:= 0 to GATEMAXSESSION - 1 do begin
UserSession:=@g_SessionArray[nIndex];
if UserSession.Socket <> nil then
UserSession.Socket.Close;
UserSession.Socket := nil;
UserSession.sRemoteIPaddr := '';
UserSession.SocketHandle := -1;
end;
ResUserSessionArray();
ClientSockeMsgList.Clear;
boGateReady :=False;
nSessionCount :=0;
end;
procedure TFrmMain.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Socket.Close;
ErrorCode:=0;
boServerReady:=False;
end;
procedure TFrmMain.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sRecvMsg:String;
begin
sRecvMsg:=Socket.ReceiveText;
ClientSockeMsgList.Add(sRecvMsg);
end;
procedure TFrmMain.SendTimerTimer(Sender : TObject);
var
nIndex:Integer;
UserSession:pTUserSession;
begin
if ServerSocket.Active then begin
n456A30:=ServerSocket.Socket.ActiveConnections;
end;
if boSendHoldTimeOut then begin
LbHold.Caption:=IntToStr(n456A30) + '#';
if (GetTickCount - dwSendHoldTick) > 3 * 1000 then boSendHoldTimeOut:=False;
end else begin
LbHold.Caption:=IntToStr(n456A30);
end;
if boGateReady and (not boKeepAliveTimcOut)then begin
for nIndex:= 0 to GATEMAXSESSION - 1 do begin
UserSession:=@g_SessionArray[nIndex];
if UserSession.Socket <> nil then begin
if (GetTickCount - UserSession.dwUserTimeOutTick) > 60 * 60 * 1000 then begin
UserSession.Socket.Close;
UserSession.Socket:=nil;
UserSession.SocketHandle:=-1;
UserSession.MsgList.Clear;
UserSession.sRemoteIPaddr:='';
end;
end;
end;
end;
if not boGateReady and (boServiceStart)then begin
if (GetTickCount - dwReConnectServerTick) > 1000{30 * 1000} then begin
dwReConnectServerTick:=GetTickCount();
ClientSocket.Active:=False;
ClientSocket.Port:=ServerPort;
ClientSocket.Host:=ServerAddr;
ClientSocket.Active:=True;
end;
end;
end;
procedure TFrmMain.TimerTimer(Sender : TObject);
begin
if ServerSocket.Active then begin
StatusBar.Panels[0].Text:=IntToStr(ServerSocket.Port);
if boSendHoldTimeOut then
StatusBar.Panels[2].Text:=IntToStr(nSessionCount) + '/#' + IntToStr(ServerSocket.Socket.ActiveConnections)
else
StatusBar.Panels[2].Text:=IntToStr(nSessionCount) + '/' + IntToStr(ServerSocket.Socket.ActiveConnections);
end else begin
StatusBar.Panels[0].Text:='????';
StatusBar.Panels[2].Text:='????';
end;
Label2.Caption:=IntToStr(dwDecodeMsgTime);
if not boGateReady then begin
//StatusBar.Panels[1].Text:='---] [---';
StatusBar.Panels[1].Text:='未连接';
end else begin
if boKeepAliveTimcOut then begin
//StatusBar.Panels[1].Text:='---]$$$$[---';
StatusBar.Panels[1].Text:='超时';
end else begin
//StatusBar.Panels[1].Text:='-----][-----';
StatusBar.Panels[1].Text:='已连接';
LbLack.Caption:=IntToStr(n456A2C) + '/' + IntToStr(nSendMsgCount);
end;
end;
if gettickcount -dwstartgate > 1000*60*60*3 then begin //1000*5
dwstartgate := gettickcount;
if ClientSocket.Active then begin
ClientSocket.Socket.SendText('%G' +
Inttostr(GatePort) +
'$');
end;
end;
end;
procedure TFrmMain.DecodeTimerTimer(Sender : TObject);
var
sProcessMsg :String;
sSocketMsg :String;
sSocketHandle :String;
nSocketIndex :Integer;
nMsgCount :Integer;
nSendRetCode :Integer;
nSocketHandle :Integer;
dwDecodeTick :LongWord;
dwDecodeTime :LongWord;
sRemoteIPaddr :String;
UserSession :pTUserSession;
IPaddr :pTSockaddr;
begin
ShowMainLogMsg();
if boDecodeLock or (not boGateReady)then exit;
try
dwDecodeTick:=GetTickCount();
boDecodeLock:=True;
sProcessMsg:='';
while (True) do begin
if ClientSockeMsgList.Count <= 0 then break;
sProcessMsg:=sProcMsg + ClientSockeMsgList.Strings[0];
sProcMsg:='';
ClientSockeMsgList.Delete(0);
while (True) do begin
if TagCount(sProcessMsg,'$') < 1 then break;
sProcessMsg:=ArrestStringEx(sProcessMsg,'%','$',sSocketMsg);
if sSocketMsg = ''then break;
if sSocketMsg[1] = '+' then begin
if sSocketMsg[2] = '-' then begin
CloseSocket(Str_ToInt(Copy(sSocketMsg,3,Length(sSocketMsg) - 2),0));
Continue;
end else begin //0x004521B7
dwKeepAliveTick:=GetTickCount();
boKeepAliveTimcOut:=False;
Continue;
end;
end; //0x004521CD
sSocketMsg:=GetValidStr3(sSocketMsg,sSocketHandle,['/']);
nSocketHandle:=Str_ToInt(sSocketHandle,-1);
if nSocketHandle < 0 then Continue;
for nSocketIndex:= 0 to GATEMAXSESSION - 1 do begin
if g_SessionArray[nSocketIndex].SocketHandle = nSocketHandle then begin
////这里可以修改服务器返回的封包
// sSocketMsg:=strpas(mir2cs(pchar(sSocketMsg),length(sSocketMsg),g_SessionArray[nSocketIndex].saccount));
g_SessionArray[nSocketIndex].MsgList.Add(sSocketMsg);
break;
end;
end;
end; //0x00452246
end; //0x452252
//if sProcessMsg <> '' then ClientSockeMsgList.Add(sProcessMsg);
if sProcessMsg <> '' then sProcMsg:=sProcessMsg;
nSendMsgCount:=0;
n456A2C:=0;
StringList318.Clear;
for nSocketIndex:= 0 to GATEMAXSESSION - 1 do begin
if g_SessionArray[nSocketIndex].SocketHandle <= -1 then Continue;
//踢除超时无数据传输连接
if (GetTickCount - g_SessionArray[nSocketIndex].dwConnctCheckTick) > dwKeepConnectTimeOut then begin
sRemoteIPaddr:=g_SessionArray[nSocketIndex].sRemoteIPaddr;
case BlockMethod of //
mDisconnect: begin
g_SessionArray[nSocketIndex].Socket.Close;
end;
mBlock: begin
New(IPaddr);
IPaddr.nIPaddr:=inet_addr(PChar(sRemoteIPaddr));
TempBlockIPList.Add(IPaddr);
CloseConnect(sRemoteIPaddr);
end;
mBlockList: begin
New(IPaddr);
IPaddr.nIPaddr:=inet_addr(PChar(sRemoteIPaddr));
BlockIPList.Add(IPaddr);
CloseConnect(sRemoteIPaddr);
end;
end;
MainOutMessage('端口空连接攻击: ' + sRemoteIPaddr,1);
Continue;
end;
while (True) do begin;
if g_SessionArray[nSocketIndex].MsgList.Count <= 0 then break;
UserSession:=@g_SessionArray[nSocketIndex];
nSendRetCode:=SendUserMsg(UserSession,UserSession.MsgList.Strings[0]);
if (nSendRetCode >= 0) then begin
if nSendRetCode = 1 then begin
UserSession.dwConnctCheckTick:=GetTickCount();
UserSession.MsgList.Delete(0);
Continue;
end;
if UserSession.MsgList.Count > 100 then begin
nMsgCount:=0;
while nMsgCount <> 51 do begin
UserSession.MsgList.Delete(0);
Inc(nMsgCount);
end;
end;
Inc(n456A2C,UserSession.MsgList.Count);
MainOutMessage(UserSession.sIP +
' : ' +
IntToStr(UserSession.MsgList.Count),5);
Inc(nSendMsgCount);
end else begin //0x004523A4
UserSession.SocketHandle:= -1;
UserSession.Socket:= nil;
UserSession.MsgList.Clear;
end;
end;
end;
if (GetTickCount - dwSendKeepAliveTick) > 2 * 1000 then begin
dwSendKeepAliveTick:=GetTickCount();
if boGateReady then
ClientSocket.Socket.SendText('%--$');
end;
if (GetTickCount - dwKeepAliveTick) > 10 * 1000 then begin
boKeepAliveTimcOut:=True;
ClientSocket.Close;
end;
finally
boDecodeLock:=False;
end;
dwDecodeTime:=GetTickCount - dwDecodeTick;
if dwDecodeMsgTime < dwDecodeTime then dwDecodeMsgTime:=dwDecodeTime;
if dwDecodeMsgTime > 50 then Dec(dwDecodeMsgTime,50);
end;
procedure TFrmMain.CloseSocket(nSocketHandle:Integer);
var
nIndex:Integer;
UserSession:pTUserSession;
begin
for nIndex:= 0 to GATEMAXSESSION - 1 do begin
UserSession:=@g_SessionArray[nIndex];
if (UserSession.Socket <> nil) and (UserSession.SocketHandle = nSocketHandle)then begin
UserSession.Socket.Close;
break;
end;
end;
end;
function TFrmMain.SendUserMsg(UserSession:pTUserSession;sSendMsg:String):Integer;
begin
Result:= -1;
if UserSession.Socket <> nil then begin
if not UserSession.bo0C then begin
if not UserSession.boSendAvailable and (GetTickCount > UserSession.dwSendLockTimeOut) then begin
UserSession.boSendAvailable := True;
UserSession.nCheckSendLength := 0;
boSendHoldTimeOut := True;
dwSendHoldTick := GetTickCount();
end; //004525DD
if UserSession.boSendAvailable then begin
if UserSession.nCheckSendLength >= 250 then begin
if not UserSession.boSendCheck then begin
UserSession.boSendCheck:=True;
sSendMsg:='*' + sSendMsg;
end;
if UserSession.nCheckSendLength >= 512 then begin
// UserSession.boSendAvailable:=False;
UserSession.dwSendLockTimeOut:=GetTickCount + 3 * 1000;
end;
end; //00452620
UserSession.Socket.SendText(sSendMsg);
Inc(UserSession.nSendMsgLen,length(sSendMsg));
Inc(UserSession.nCheckSendLength,length(sSendMsg));
Result:= 1;
end else begin //0x0045264A
Result:= 0;
end;
end else begin //0x00452651
Result:= 0;
end;
end;
end;
procedure TFrmMain.LoadConfig;
var
Conf:TIniFile;
sConfigFileName:String;
begin
sConfigFileName:='.\Config.ini';
Conf := TIniFile.Create(sConfigFileName);
TitleName := Conf.ReadString(GateClass,'Title',TitleName);
ServerPort := Conf.ReadInteger(GateClass,'ServerPort',ServerPort);
ServerAddr := Conf.ReadString(GateClass,'ServerAddr',ServerAddr);
GatePort := Conf.ReadInteger(GateClass,'GatePort',GatePort);
GateAddr := Conf.ReadString(GateClass,'GateAddr',GateAddr);
nShowLogLevel := Conf.ReadInteger(GateClass,'ShowLogLevel',nShowLogLevel);
BlockMethod:=TBlockIPMethod(Conf.ReadInteger(GateClass,'BlockMethod',Integer(BlockMethod)));
if Conf.ReadInteger(GateClass,'KeepConnectTimeOut',-1) <= 0 then
Conf.WriteInteger(GateClass,'KeepConnectTimeOut',dwKeepConnectTimeOut);
nMaxConnOfIPaddr:=Conf.ReadInteger(GateClass,'MaxConnOfIPaddr',nMaxConnOfIPaddr);
nMaxMsgLen:=Conf.ReadInteger(GateClass,'MaxMsgLen',nMaxMsgLen);
dwKeepConnectTimeOut:= Conf.ReadInteger(GateClass,'KeepConnectTimeOut',dwKeepConnectTimeOut);
g_boDynamicIPDisMode:= Conf.ReadBool(GateClass,'DynamicIPDisMode',g_boDynamicIPDisMode);
Conf.Free;
LoadBlockIPFile();
end;
procedure TFrmMain.StartService;
begin
try
// MainOutMessage('欢迎使用翎风系统软件...',0);
// MainOutMessage('网站:http://www.gameofmir.com',0);
// MainOutMessage('论坛:http://bbs.gameofmir.com',0);
MainOutMessage('正在启动服务...',3);
// SendGameCenterMsg(SG_STARTNOW,g_sNowStartGate);
boServiceStart:=True;
boGateReady:=False;
boServerReady:=False;
nSessionCount:=0;
MENU_CONTROL_START.Enabled:=False;
MENU_CONTROL_STOP.Enabled:=True;
Caption:=GateName + ' - ' + TitleName;
dwReConnectServerTick:=GetTickCount - 25 * 1000;
boKeepAliveTimcOut:=False;
nSendMsgCount:=0;
n456A2C:=0;
dwSendKeepAliveTick:=GetTickCount();
boSendHoldTimeOut:=False;
dwSendHoldTick:=GetTickCount();
CurrIPaddrList :=TList.Create;
BlockIPList :=TList.Create;
TempBlockIPList :=TList.Create;
ClientSockeMsgList :=TStringList.Create;
ResUserSessionArray();
LoadConfig();
ClientSocket.Active:=False;
ClientSocket.Host:=ServerAddr;
ClientSocket.Port:=ServerPort;
ClientSocket.Active:=True;
ServerSocket.Active:=False;
ServerSocket.Address:=GateAddr;
ServerSocket.Port:=GatePort;
ServerSocket.Active:=True;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -