📄 main.pas
字号:
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;
SendTimer.Enabled := True;
MainOutMessage('启动服务完成...', 3);
// SendGameCenterMsg(SG_STARTOK,g_sNowStartOK);
except
on E: Exception do
begin
MENU_CONTROL_START.Enabled := True;
MENU_CONTROL_STOP.Enabled := False;
MainOutMessage(E.Message, 0);
end;
end;
end;
procedure TFrmMain.StopService;
var
I : Integer;
nSockIdx : Integer;
IPaddr : pTSockaddr;
begin
MainOutMessage('正在停止服务...', 3);
boServiceStart := False;
boGateReady := False;
MENU_CONTROL_START.Enabled := True;
MENU_CONTROL_STOP.Enabled := False;
SendTimer.Enabled := False;
for nSockIdx := 0 to GATEMAXSESSION - 1 do
begin
if g_SessionArray[nSockIdx].Socket <> nil then
g_SessionArray[nSockIdx].Socket.Close;
end;
SaveBlockIPList();
ServerSocket.Close;
ClientSocket.Close;
ClientSockeMsgList.Free;
for I := 0 to CurrIPaddrList.Count - 1 do
begin
IPaddr := CurrIPaddrList.Items[I];
Dispose(IPaddr);
end;
CurrIPaddrList.Free;
for I := 0 to BlockIPList.Count - 1 do
begin
IPaddr := BlockIPList.Items[I];
Dispose(IPaddr);
end;
BlockIPList.Free;
for I := 0 to TempBlockIPList.Count - 1 do
begin
IPaddr := TempBlockIPList.Items[I];
Dispose(IPaddr);
end;
TempBlockIPList.Free;
MainOutMessage('停止服务完成...', 3);
end;
procedure TFrmMain.ResUserSessionArray;
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.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.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;
nIPaddr := inet_addr(PChar(sIPaddr));
for I := 0 to TempBlockIPList.Count - 1 do
begin
IPaddr := TempBlockIPList.Items[I];
if IPaddr.nIPaddr = nIPaddr then
begin
Result := True;
exit;
end;
end;
for I := 0 to BlockIPList.Count - 1 do
begin
IPaddr := BlockIPList.Items[I];
if IPaddr.nIPaddr = nIPaddr then
begin
Result := True;
exit;
end;
end;
end;
{function TFrmMain.IsConnLimited(sIPaddr: String): Boolean;
var
i,nCount:Integer;
begin
nCount:=0;
Result:=False;
for I := 0 to ServerSocket.Socket.ActiveConnections - 1 do begin
if CompareText(sIPaddr,ServerSocket.Socket.Connections[i].RemoteAddress) = 0 then Inc(nCount);
end;
if nCount > nMaxConnOfIPaddr then begin
Result:=True;
end;
end;}
function TFrmMain.IsConnLimited(sIPaddr: string): Boolean;
var
I : Integer;
IPaddr : pTSockaddr;
nIPaddr : Integer;
boDenyConnect : Boolean;
begin
Result := False;
boDenyConnect := False;
nIPaddr := inet_addr(PChar(sIPaddr));
for I := 0 to CurrIPaddrList.Count - 1 do
begin
IPaddr := CurrIPaddrList.Items[I];
if IPaddr.nIPaddr = nIPaddr then
begin
Inc(IPaddr.nCount);
if GetTickCount - IPaddr.dwIPCountTick1 < 1000 then
begin
Inc(IPaddr.nIPCount1);
if IPaddr.nIPCount1 >= nIPCountLimit1 then
boDenyConnect := True;
end
else
begin
IPaddr.dwIPCountTick1 := GetTickCount();
IPaddr.nIPCount1 := 0;
end;
if GetTickCount - IPaddr.dwIPCountTick2 < 3000 then
begin
Inc(IPaddr.nIPCount2);
if IPaddr.nIPCount2 >= nIPCountLimit2 then
boDenyConnect := True;
end
else
begin
IPaddr.dwIPCountTick2 := GetTickCount();
IPaddr.nIPCount2 := 0;
end;
if IPaddr.nCount > nMaxConnOfIPaddr then
boDenyConnect := True;
Result := boDenyConnect;
exit;
end;
end;
New(IPaddr);
FillChar(IPaddr^, SizeOf(TSockaddr), 0);
IPaddr.nIPaddr := nIPaddr;
IPaddr.nCount := 1;
CurrIPaddrList.Add(IPaddr);
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);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -