📄 main.pas
字号:
nOPacketIdx, nPacketIdx, nDataLen, n14: Integer;
DefMsg : TDefaultMessage;
begin
try
n14 := 0;
Inc(nProcessMsgSize, Length(UserData.sMsg));
if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION)
then
begin
if (UserData.nSocketHandle = SessionArray[UserData.nSocketIdx].nSckHandle)
and
(SessionArray[UserData.nSocketIdx].nPacketErrCount < 10) then
begin
if Length(SessionArray[UserData.nSocketIdx].sSocData) > MSGMAXLENGTH
then
begin
SessionArray[UserData.nSocketIdx].sSocData := '';
SessionArray[UserData.nSocketIdx].nPacketErrCount := 99;
UserData.sMsg := '';
end; //00455F7A
sMsg := SessionArray[UserData.nSocketIdx].sSocData + UserData.sMsg;
while (True) do
begin //00455FA0
sData := '';
sMsg := ArrestStringEx(sMsg, '#', '!', sData);
if Length(sData) > 2 then
begin
nPacketIdx := Str_ToInt(sData[1], 99); //将数据名第一位的序号取出
if SessionArray[UserData.nSocketIdx].nPacketIdx = nPacketIdx then
begin
//如果序号重复则增加错误计数
Inc(SessionArray[UserData.nSocketIdx].nPacketErrCount);
end
else
begin
nOPacketIdx := SessionArray[UserData.nSocketIdx].nPacketIdx;
SessionArray[UserData.nSocketIdx].nPacketIdx := nPacketIdx;
sData := Copy(sData, 2, Length(sData) - 1);
nDataLen := Length(sData);
if (nDataLen >= DEFBLOCKSIZE) then
begin
if SessionArray[UserData.nSocketIdx].boStartLogon then
begin
//第一个人物登录数据包
Inc(nHumLogonMsgSize, Length(sData));
SessionArray[UserData.nSocketIdx].boStartLogon := False;
sData := '#' + IntToStr(nPacketIdx) + sData + '!';
GetMem(Buffer, Length(sData) + 1);
Move(sData[1], Buffer^, Length(sData) + 1);
SendServerMsg(GM_DATA,
UserData.nSocketIdx,
SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
SessionArray[UserData.nSocketIdx].nUserListIndex,
Length(sData) + 1,
Buffer);
FreeMem(Buffer);
end
else
begin //0045615F
//普通数据包
Inc(nHumPlayMsgSize, Length(sData));
if nDataLen = DEFBLOCKSIZE then
begin
sDefMsg := sData;
sDataMsg := '';
end
else
begin //0045618B
sDefMsg := Copy(sData, 1, DEFBLOCKSIZE);
sDataMsg := Copy(sData, DEFBLOCKSIZE + 1, Length(sData) -
DEFBLOCKSIZE);
end; //004561BF
DefMsg := DecodeMessage(sDefMsg);
//检查数据
{
if not CheckDefMsg(@DefMsg,@SessionArray[UserData.nSocketIdx]) then begin
//SessionArray[UserData.nSocketIdx].nPacketIdx:=nOPacketIdx;
//sMsg:='#' + IntToStr(nPacketIdx) + sData + '!' + sMsg;
Continue;
end;
}
if sDataMsg <> '' then
begin
if DefMsg.Ident = CM_SAY then
begin
//控制发言间隔时间
//if (GetTickCount - SessionArray[UserData.nSocketIdx].dwSayMsgTick) < dwSayMsgTime then Continue;
//SessionArray[UserData.nSocketIdx].dwSayMsgTick:=GetTickCount();
sDataText := DecodeString(sDataMsg);
if sDataText <> '' then
begin
if sDataText[1] = '/' then
begin
sDataText := GetValidStr3(sDataText, sHumName, [' ']);
//限制最长可发字符长度
//if length(sDataText) > nSayMsgMaxLen then
// sDataText:=Copy(sDataText,1,nSayMsgMaxLen);
FilterSayMsg(sDataText);
sDataText := sHumName + ' ' + sDataText;
end
else
begin //0045623A
if sDataText[1] <> '@' then
begin
//限制最长可发字符长度
//if length(sDataText) > nSayMsgMaxLen then
// sDataText:=Copy(sDataText,1,nSayMsgMaxLen);
FilterSayMsg(sDataText);
end;
end;
end;
if sDataText='' then Continue;
sDataMsg := EncodeString(sDataText);
end; //00456255
GetMem(Buffer, Length(sDataMsg) + SizeOf(TDefaultMessage) +
1);
Move(DefMsg, Buffer^, SizeOf(TDefaultMessage));
Move(sDataMsg[1], Buffer[SizeOf(TDefaultMessage)],
Length(sDataMsg) + 1);
SendServerMsg(GM_DATA,
UserData.nSocketIdx,
SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
SessionArray[UserData.nSocketIdx].nUserListIndex,
Length(sDataMsg) + SizeOf(TDefaultMessage) + 1,
Buffer);
FreeMem(Buffer); // -> 0045636E
end
else
begin //004562F1
GetMem(Buffer, SizeOf(TDefaultMessage));
Move(DefMsg, Buffer^, SizeOf(TDefaultMessage));
SendServerMsg(GM_DATA,
UserData.nSocketIdx,
SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
SessionArray[UserData.nSocketIdx].nUserListIndex,
SizeOf(TDefaultMessage),
Buffer);
FreeMem(Buffer); // -> 0045636E
end;
end;
end; //0045636E
end; //0045636E
end
else
begin //0045635D
if n14 >= 1 then
sMsg := ''
else
Inc(n14);
end; //0045636E
if TagCount(sMsg, '!') < 1 then
break; //00455FA0
end;
SessionArray[UserData.nSocketIdx].sSocData := sMsg;
end
else
begin //0045639C
SessionArray[UserData.nSocketIdx].sSocData := '';
end;
end; //004563B4
except
if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION)
then
begin
sData := '[' + SessionArray[UserData.nSocketIdx].sRemoteAddr + ']';
end;
AddMainLogMsg('[Exception] ProcessUserPacket' + sData, 1);
end;
end;
procedure TFrmMain.ProcessPacket(UserData: pTSendUserData);
//004564E4
var
sData, sSendBlock : string;
UserSession : pTSessionInfo;
begin
if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION) then
begin
UserSession := @SessionArray[UserData.nSocketIdx];
if UserSession.nSckHandle = UserData.nSocketHandle then
begin
Inc(nDeCodeMsgSize, Length(UserData.sMsg));
sData := UserSession.sSendData + UserData.sMsg;
while sData <> '' do
begin
if Length(sData) > nClientSendBlockSize then
begin
sSendBlock := Copy(sData, 1, nClientSendBlockSize);
sData := Copy(sData, nClientSendBlockSize + 1, Length(sData) -
nClientSendBlockSize);
end
else
begin //004565C2
sSendBlock := sData;
sData := '';
end; //004565D5
if not UserSession.boSendAvailable then
begin
if GetTickCount > UserSession.dwTimeOutTime then
begin
UserSession.boSendAvailable := True;
UserSession.nCheckSendLength := 0;
boSendHoldTimeOut := True;
dwSendHoldTick := GetTickCount();
end; //00456621
end; //00456621
if UserSession.boSendAvailable then
begin
if UserSession.nCheckSendLength >= SENDCHECKSIZE then
begin
if not UserSession.boSendCheck then
begin
UserSession.boSendCheck := True;
sSendBlock := '*' + sSendBlock;
end; //0045665A
if UserSession.nCheckSendLength >= SENDCHECKSIZEMAX then
begin
UserSession.boSendAvailable := False;
UserSession.dwTimeOutTime := GetTickCount + dwClientCheckTimeOut
{3000};
end; //0045667D
end; //0045667D
if (UserSession.Socket <> nil) and (UserSession.Socket.Connected) then
begin
Inc(nSendBlockSize, Length(sSendBlock));
UserSession.Socket.SendText(sSendBlock);
end; //004566AE
Inc(UserSession.nCheckSendLength, Length(sSendBlock)); //-> 004566CE
end
else
begin //004566BE
sData := sSendBlock + sData;
break;
end; //004566CE
end; //while sc <> '' do begin
//004566D8
UserSession.sSendData := sData;
end; //004566F3
end; //004566F3
end;
procedure TFrmMain.FilterSayMsg(var sMsg: string);
var
i, nLen : Integer;
sReplaceText : string;
sFilterText : string;
begin
try
CS_FilterMsg.Enter;
for i := 0 to AbuseList.Count - 1 do
begin
sFilterText := AbuseList.Strings[i];
sReplaceText := '';
if AnsiContainsText(sMsg, sFilterText) then
begin
{ for nLen := 1 to Length(sFilterText) do
begin
sReplaceText := sReplaceText + sReplaceWord;
end;
sMsg := AnsiReplaceText(sMsg, sFilterText, sReplaceText);
}
sMsg:='';
end;
end;
finally
CS_FilterMsg.Leave;
end;
end;
procedure TFrmMain.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
//00454E0C
begin
ErrorCode := 0;
Socket.Close;
boServerReady := False;
end;
procedure TFrmMain.MENU_CONTROL_EXITClick(Sender: TObject);
begin
Close;
end;
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if boClose then
exit;
// if MessageDlg('是否确认退出服务器?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
if Application.MessageBox('是否确认退出服务器?',
'确认信息',
MB_YESNO + MB_ICONQUESTION) = IDYES then
begin
if boServiceStart then
begin
StartTimer.Enabled := True;
CanClose := False;
end;
end
else
CanClose := False;
end;
procedure TFrmMain.MENU_CONTROL_STARTClick(Sender: TObject);
begin
StartService();
end;
procedure TFrmMain.StartService;
begin
try
AddMainLogMsg('正在启动服务...', 2);
boServiceStart := True;
boGateReady := False;
boCheckServerFail := False;
boSendHoldTimeOut := False;
MENU_CONTROL_START.Enabled := False;
POPMENU_START.Enabled := False;
POPMENU_CONNSTOP.Enabled := True;
MENU_CONTROL_STOP.Enabled := True;
SessionCount := 0;
LoadConfig();
Caption := GateName + ' - ' + TitleName;
RestSessionArray();
dwProcessReviceMsgTimeLimit := 50;
dwProcessSendMsgTimeLimit := 50;
boServerReady := False;
dwReConnectServerTime := GetTickCount - 25000; //0045498C
dwRefConsolMsgTick := GetTickCount();
dwCheckServerTick:=GetTickCount();
ServerSocket.Active := False;
ServerSocket.Address := GateAddr;
ServerSocket.Port := GatePort;
ServerSocket.Active := True;
ClientSocket.Active := False;
ClientSocket.Address := ServerAddr;
ClientSocket.Port := ServerPort;
ClientSocket.Active := True;
SendTimer.Enabled := True;
AddMainLogMsg('服务已启动成功...', 2);
except
on E: Exception do
begin
MENU_CONTROL_START.Enabled := True;
MENU_CONTROL_STOP.Enabled := False;
POPMENU_START.Enabled := True;
POPMENU_CONNSTOP.Enabled := False;
AddMainLogMsg(E.Message, 0);
end;
end;
end;
procedure TFrmMain.StopService;
var
nSockIdx : Integer;
begin
AddMainLogMsg('正在停止服务...', 2);
boServiceStart := False;
boGateReady := False;
MENU_CONTROL_START.Enabled := True;
MENU_CONTROL_STOP.Enabled := False;
POPMENU_START.Enabled := True;
POPMENU_CONNSTOP.Enabled := False;
for nSockIdx := 0 to GATEMAXSESSION - 1 do
begin
if SessionArray[nSockIdx].Socket <> nil then
SessionArray[nSockIdx].Socket.Close;
end;
ServerSocket.Close;
ClientSocket.Close;
AddMainLogMsg('服务停止成功...', 2);
end;
procedure TFrmMain.MENU_CONTROL_STOPClick(Sender: TObject);
begin
if Application.MessageBox('是否确认停止服务?',
'确认信息',
MB_YESNO + MB_ICONQUESTION) = IDYES then
StopService();
end;
procedure TFrmMain.LoadConfig;
begin
AddMainLogMsg('正在加载配置信息...', 3);
if Conf <> nil then
begin
TitleName := Conf.ReadString(GateClass, 'Title', TitleName);
ServerAddr := Conf.ReadString(GateClass, 'ServerAddr', ServerAddr);
ServerPort := Conf.ReadInteger(GateClass, 'ServerPort', ServerPort);
GateAddr := Conf.ReadString(GateClass, 'GateAddr', GateAddr);
GatePort := Conf.ReadInteger(GateClass, 'GatePort', GatePort);
nShowLogLevel := Conf.ReadInteger(GateClass, 'ShowLogLevel', nShowLogLevel);
boShowBite := Conf.ReadBool(GateClass, 'ShowBite', boShowBite);
nMaxConnOfIPaddr := Conf.ReadInteger(GateClass, 'MaxConnOfIPaddr',
nMaxConnOfIPaddr);
BlockMethod := TBlockIPMethod(Conf.ReadInteger(GateClass, 'BlockMethod',
Integer(BlockMethod)));
nMaxClientPacketSize := Conf.ReadInteger(GateClass, 'MaxClientPacketSize',
nMaxClientPacketSize);
nNomClientPacketSize := Conf.ReadInteger(GateClass, 'NomClientPacketSize',
nNomClientPacketSize);
nMaxClientMsgCount := Conf.ReadInteger(GateClass, 'MaxClientMsgCount',
nMaxClientMsgCount);
bokickOverPacketSize := Conf.ReadBool(GateClass, 'kickOverPacket',
bokickOverPacketSize);
dwCheckServerTimeOutTime := Conf.ReadInteger(GateClass,
'ServerCheckTimeOut', dwCheckServerTimeOutTime);
nClientSendBlockSize := Conf.ReadInteger(GateClass, 'ClientSendBlockSize',
nClientSendBlockSize);
dwClientTimeOutTime := Conf.ReadInteger(GateClass, 'ClientTimeOutTime',
dwClientTimeOutTime);
dwSessionTimeOutTime := Conf.ReadInteger(GateClass, 'SessionTimeOutTime',
dwSessionTimeOutTime);
nSayMsgMaxLen := Conf.ReadInteger(GateClass, 'SayMsgMaxLen', nSayMsgMaxLen);
dwSayMsgTime := Conf.ReadInteger(GateClass, 'SayMsgTime', dwSayMsgTime);
end;
AddMainLogMsg('配置信息加载完成...', 3);
LoadAbuseFile();
LoadBlockIPFile();
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -