📄 massock.pas
字号:
unit MasSock;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, D7ScktComp;
type
TMsgServerInfo = record
sReceiveMsg: string;
Socket: TCustomWinSocket;
sServerName: string; //0x08
nServerIndex: Integer; //0x0C
nOnlineCount: Integer; //0x10
dwKeepAliveTick: LongWord; //0x14
sIPaddr: string;
end;
pTMsgServerInfo = ^TMsgServerInfo;
TLimitServerUserInfo = record
sServerName: string;
sName: string;
nLimitCountMin: Integer;
nLimitCountMax: Integer;
end;
pTLimitServerUserInfo = ^TLimitServerUserInfo;
TFrmMasSoc = class(TForm)
MSocket: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure MSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
procedure SortServerList(nIndex: Integer);
procedure RefServerLimit(sServerName: string);
function LimitName(sServerName: string): string;
procedure LoadUserLimit;
{ Private declarations }
public
m_ServerList: TList;
procedure LoadServerAddr();
function CheckReadyServers(): Boolean;
procedure SendServerMsg(wIdent: Word; sServerName, sMsg: string);
procedure SendServerMsgA(wIdent: Word; sMsg: string);
function IsNotUserFull(sServerName: string): Boolean;
function ServerStatus(sServerName: string): Integer;
function GetOnlineHumCount(): Integer;
{ Public declarations }
end;
var
FrmMasSoc : TFrmMasSoc;
nUserLimit : Integer;
UserLimit : array[0..99] of TLimitServerUserInfo;
implementation
uses LSShare, LMain, HUtil32, Grobal2;
{$R *.DFM}
//00465934
procedure TFrmMasSoc.FormCreate(Sender: TObject);
var
Config : pTConfig;
begin
Config := @g_Config;
m_ServerList := TList.Create;
MSocket.Address := Config.sServerAddr;
MSocket.Port := Config.nServerPort;
MSocket.Active := true;
LoadServerAddr();
LoadUserLimit();
end;
//00465B08
procedure TFrmMasSoc.MSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
I : Integer;
sRemoteAddr : string;
boAllowed : Boolean;
MsgServer : pTMsgServerInfo;
begin
sRemoteAddr := Socket.RemoteAddress;
boAllowed := False;
for I := Low(ServerAddr) to High(ServerAddr) do
if sRemoteAddr = ServerAddr[I] then
begin
boAllowed := true;
break;
end;
if boAllowed then
begin
New(MsgServer);
FillChar(MsgServer^, SizeOf(TMsgServerInfo), #0);
MsgServer.sReceiveMsg := '';
MsgServer.Socket := Socket;
m_ServerList.Add(MsgServer);
end
else
begin
MainOutMessage('非法地址连接:' + sRemoteAddr);
Socket.Close;
end;
end;
//00465C54
procedure TFrmMasSoc.MSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
I : Integer;
MsgServer : pTMsgServerInfo;
begin
for I := 0 to m_ServerList.Count - 1 do
begin
MsgServer := m_ServerList.Items[I];
if MsgServer.Socket = Socket then
begin
Dispose(MsgServer);
m_ServerList.Delete(I);
break;
end;
end;
end;
procedure TFrmMasSoc.MSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0;
Socket.Close;
end;
//0046611C
procedure TFrmMasSoc.MSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
I : Integer;
MsgServer : pTMsgServerInfo;
sReviceMsg : string;
sMsg : string;
sCode : string;
sAccount : string;
sServerName : string;
sIndex : string;
sOnlineCount : string;
nCode : Integer;
Config : pTConfig;
begin
Config := @g_Config;
for I := 0 to m_ServerList.Count - 1 do
begin
MsgServer := m_ServerList.Items[I];
if MsgServer.Socket = Socket then
begin
sReviceMsg := MsgServer.sReceiveMsg + Socket.ReceiveText;
while (Pos(')', sReviceMsg) > 0) do
begin
sReviceMsg := ArrestStringEx(sReviceMsg, '(', ')', sMsg);
if sMsg = '' then
break;
sMsg := GetValidStr3(sMsg, sCode, ['/']);
nCode := Str_ToInt(sCode, -1);
case nCode of
SS_SOFTOUTSESSION:
begin
sMsg := GetValidStr3(sMsg, sAccount, ['/']);
CloseUser(Config, sAccount, Str_ToInt(sMsg, 0));
end;
SS_SERVERINFO:
begin
sMsg := GetValidStr3(sMsg, sServerName, ['/']);
sMsg := GetValidStr3(sMsg, sIndex, ['/']);
sMsg := GetValidStr3(sMsg, sOnlineCount, ['/']);
MsgServer.sServerName := sServerName;
MsgServer.nServerIndex := Str_ToInt(sIndex, 0);
MsgServer.nOnlineCount := Str_ToInt(sOnlineCount, 0);
MsgServer.dwKeepAliveTick := GetTickCount();
SortServerList(I);
nOnlineCountMin := GetOnlineHumCount();
if nOnlineCountMin > nOnlineCountMax then
nOnlineCountMax := nOnlineCountMin;
SendServerMsgA(SS_KEEPALIVE, IntToStr(nOnlineCountMin));
RefServerLimit(sServerName);
end;
UNKNOWMSG: SendServerMsgA(UNKNOWMSG, sMsg);
end;
end;
end;
MsgServer.sReceiveMsg := sReviceMsg;
end;
end;
procedure TFrmMasSoc.FormDestroy(Sender: TObject);
begin
m_ServerList.Free;
end;
//00465CF8
procedure TFrmMasSoc.RefServerLimit(sServerName: string);
var
I : Integer;
nCount : Integer;
MsgServer : pTMsgServerInfo;
begin
try
nCount := 0;
for I := 0 to m_ServerList.Count - 1 do
begin
MsgServer := m_ServerList.Items[I];
if (MsgServer.nServerIndex <> 99) and (MsgServer.sServerName = sServerName)
then
Inc(nCount, MsgServer.nOnlineCount);
end;
for I := Low(UserLimit) to High(UserLimit) do
begin
if UserLimit[I].sServerName = sServerName then
begin
UserLimit[I].nLimitCountMin := nCount;
break;
end;
end;
except
MainOutMessage('TFrmMasSoc.RefServerLimit');
end;
end;
//00465E78
function TFrmMasSoc.IsNotUserFull(sServerName: string): Boolean;
var
I : Integer;
begin
Result := true;
for I := Low(UserLimit) to High(UserLimit) do
begin
if UserLimit[I].sServerName = sServerName then
begin
if UserLimit[I].nLimitCountMin > UserLimit[I].nLimitCountMax then
Result := False;
break;
end;
end;
end;
//00465F18
procedure TFrmMasSoc.SortServerList(nIndex: Integer);
var
nC, n10, n14 : Integer;
MsgServerSort : pTMsgServerInfo;
MsgServer : pTMsgServerInfo;
nNewIndex : Integer;
begin
try
if m_ServerList.Count <= nIndex then
exit;
MsgServerSort := m_ServerList.Items[nIndex];
m_ServerList.Delete(nIndex);
for nC := 0 to m_ServerList.Count - 1 do
begin
MsgServer := m_ServerList.Items[nC];
if MsgServer.sServerName = MsgServerSort.sServerName then
begin
if MsgServer.nServerIndex < MsgServerSort.nServerIndex then
begin
m_ServerList.Insert(nC, MsgServerSort);
exit;
end
else
begin //00465FD8
nNewIndex := nC + 1;
if nNewIndex < m_ServerList.Count then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -