📄 runsock.~pas
字号:
if GateUser = nil then begin
for I:=0 to Gate.UserList.Count -1 do begin
if Gate.UserList.Items[I] = nil then Continue;
if pTGateUserInfo(Gate.UserList.Items[I]).nSocket = MsgHeader.nSocket then begin
GateUser:=Gate.UserList.Items[I];
break;
end;
end;
end;
nCheckCode:=6;
if GateUser <> nil then begin
if (GateUser.PlayObject <> nil) and (GateUser.UserEngine <> nil) then begin
if GateUser.boCertification and (nMsgLen >= SizeOf(TDefaultMessage)) then begin
if nMsgLen = SizeOf(TDefaultMessage) then begin
UserEngine.ProcessUserMessage(TPlayObject(GateUser.PlayObject),pTDefaultMessage(MsgBuff),nil)
end else begin//004E161A
UserEngine.ProcessUserMessage(TPlayObject(GateUser.PlayObject),pTDefaultMessage(MsgBuff),@MsgBuff[SizeOf(TDefaultMessage)]);
end;
end;
end else begin//004E1638
DoClientCertification(GateIdx,GateUser,MsgHeader.nSocket,StrPas(MsgBuff));
end;
end;//004E165C
end;
end;
except
MainOutMessage(format(sExceptionMsg,[nCheckCode]));
end;
end;
procedure TRunSocket.SendCheck(Socket:TCustomWinSocket;nIdent:Integer);//004E0984
var
MsgHeader:TMsgHeader;
begin
if not Socket.Connected then exit;
MsgHeader.dwCode := RUNGATECODE;
MsgHeader.nSocket := 0;
MsgHeader.wIdent := nIdent;
MsgHeader.nLength := 0;
if Socket <> nil then
Socket.SendBuf(MsgHeader,SizeOf(TMsgHeader));
end;
procedure TRunSocket.LoadRunAddr();//004DFBA0
var
sFileName:String;
begin
sFileName:='.\RunAddr.txt';
if FileExists(sFileName) then begin
m_RunAddrList.LoadFromFile(sFileName);
TrimStringList(m_RunAddrList);
end;
end;
//constructor TRunSocket.Create(CreateSuspended: Boolean);//004DFA34
constructor TRunSocket.Create();//004DFA34
var
I :Integer;
Gate :pTGateInfo;
begin
InitializeCriticalSection(m_RunSocketSection);
m_RunAddrList:=TStringList.Create;
for I:= Low(g_GateArr) to High(g_GateArr) do begin
Gate := @g_GateArr[I];
Gate.boUsed := False;
Gate.Socket := nil;
Gate.boSendKeepAlive := False;
Gate.nSendMsgCount := 0;
Gate.nSendRemainCount := 0;
Gate.dwSendTick := GetTickCount();
Gate.nSendMsgBytes := 0;
Gate.nSendedMsgCount := 0;
end;
LoadRunAddr();//call sub_4DFBA0
n4F8:=0;
end;
procedure TRunSocket.DemoRun;
begin
{$IF SoftVersion = VERDEMO}
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
Run();
{$IFEND}
end;
destructor TRunSocket.Destroy;//004DFB4C
begin
m_RunAddrList.Free;
DeleteCriticalSection(m_RunSocketSection);
inherited;
end;
function TRunSocket.AddGateBuffer(GateIdx: Integer;Buffer: PChar):Boolean;//004E0C1C
var
Gate:pTGateInfo;
begin
Result:=False;
EnterCriticalSection(m_RunSocketSection);
try
if GateIdx < RUNGATEMAX then begin
Gate:=@g_GateArr[GateIdx];
if (Gate.BufferList <> nil) and (Buffer <> nil) then begin
if Gate.boUsed and (Gate.Socket <> nil) then begin
Gate.BufferList.Add(Buffer);
Result:=True;
end;
end;
end;
finally
LeaveCriticalSection(m_RunSocketSection);
end;
end;
procedure TRunSocket.SendOutConnectMsg(nGateIdx,nSocket,nGsIdx:integer);//004E08E4
var
DefMsg :TDefaultMessage;
MsgHeader :TMsgHeader;
nLen :Integer;
Buff :PChar;
begin
DefMsg:=MakeDefaultMsg(SM_OUTOFCONNECTION,0,0,0,0);
MsgHeader.dwCode := RUNGATECODE;
MsgHeader.nSocket := nSocket;
MsgHeader.wGSocketIdx := nGsIdx;
MsgHeader.wIdent := GM_DATA;
MsgHeader.nLength := SizeOf(TDefaultMessage);
nLen:=MsgHeader.nLength + SizeOf(TMsgHeader);
GetMem(Buff,nLen + SizeOf(Integer));
Move(nLen,Buff^,SizeOf(Integer));
Move(MsgHeader,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
Move(DefMsg,Buff[SizeOf(Integer) + SizeOf(TMsgHeader)],SizeOf(TDefaultMessage));
if not AddGateBuffer(nGateIdx,Buff) then begin
FreeMem(Buff);
end;
end;
procedure TRunSocket.SendScanMsg(DefMsg:pTDefaultMessage;sMsg:String;nGateIdx,nSocket,nGsIdx:integer);
var
MsgHdr:TMsgHeader;
nLen:Integer;
Buff:PChar;
nSendBytes:Integer;
begin
MsgHdr.dwCode := RUNGATECODE;
MsgHdr.nSocket := nSocket;
MsgHdr.wGSocketIdx := nGsIdx;
MsgHdr.wIdent := GM_DATA;
MsgHdr.nLength := SizeOf(TDefaultMessage);
if DefMsg <> nil then begin
if sMsg <> '' then begin
MsgHdr.nLength:=Length(sMsg) + SizeOf(TDefaultMessage) + 1;
nSendBytes:=MsgHdr.nLength + SizeOf(TMsgHeader);
GetMem(Buff,nSendBytes + SizeOf(Integer));
Move(nSendBytes,Buff^,SizeOf(Integer));
Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
Move(DefMsg^,Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],SizeOf(TDefaultMessage));
Move(sMsg[1],Buff[SizeOf(TDefaultMessage) + SizeOf(TMsgHeader) + SizeOf(Integer)],Length(sMsg) + 1);
end else begin//004CAC29
MsgHdr.nLength:=SizeOf(TDefaultMessage);
nSendBytes:=MsgHdr.nLength + SizeOf(TMsgHeader);
GetMem(Buff,nSendBytes + SizeOf(Integer));
Move(nSendBytes,Buff^,SizeOf(Integer));
Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
Move(DefMsg^,Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],SizeOf(TDefaultMessage));
end;
end else begin//004CAC7F
if sMsg <> '' then begin
MsgHdr.nLength:= - (Length(sMsg) + 1);
nSendBytes:=abs(MsgHdr.nLength) + SizeOf(TMsgHeader);
GetMem(Buff,nSendBytes + SizeOf(Integer));
Move(nSendBytes,Buff^,SizeOf(Integer));
Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
Move(sMsg[1],Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],Length(sMsg) + 1);
end;//004CACF0
end;//004CACF0
if not RunSocket.AddGateBuffer(nGateIdx,Buff) then begin
FreeMem(Buff);
end;
end;
procedure TRunSocket.SetGateUserList(nGateIdx, nSocket: Integer;PlayObject:TPlayObject);//004E0CEC
var
I :Integer;
GateUserInfo :pTGateUserInfo;
Gate :pTGateInfo;
begin
if nGateIdx > high(g_GateArr) then exit;
Gate:=@g_GateArr[nGateIdx];
if Gate.UserList = nil then exit;
EnterCriticalSection(m_RunSocketSection);
try
for I := 0 to Gate.UserList.Count - 1 do begin
GateUserInfo:=Gate.UserList.Items[I];
if (GateUserInfo <> nil) and (GateUserInfo.nSocket = nSocket) then begin
GateUserInfo.FrontEngine := nil;
GateUserInfo.UserEngine := UserEngine;
GateUserInfo.PlayObject := PlayObject;
break;
end;
end;
finally
LeaveCriticalSection(m_RunSocketSection);
end;
end;
procedure TRunSocket.SendGateTestMsg(nIndex:Integer);//004E0860
var
MsgHdr:TMsgHeader;
Buff:PChar;
nLen:Integer;
DefMsg:TDefaultMessage;
begin
MsgHdr.dwCode := RUNGATECODE;
MsgHdr.nSocket := 0;
MsgHdr.wIdent := GM_TEST;
MsgHdr.nLength := 100;
nLen:=MsgHdr.nLength + SizeOf(TMsgHeader);
GetMem(Buff,nLen + SizeOf(Integer));
Move(nLen,Buff^,SizeOf(Integer));
Move(MsgHdr,Buff[SizeOf(Integer)],SizeOf(TMsgHeader));
Move(DefMsg,Buff[SizeOf(TMsgHeader) + SizeOf(Integer)],SizeOf(TDefaultMessage));
if not AddGateBuffer(nIndex,Buff) then begin
FreeMem(Buff);
//MainOutMessage('SendGateTestMsg Buffer Fail ' + IntToStr(nIndex));
end;
end;
procedure TRunSocket.KickUser(sAccount: String; nSessionID: Integer);//004E0A2C
var
I :Integer;
II :Integer;
GateUserInfo :pTGateUserInfo;
Gate :pTGateInfo;
nCheckCode :Integer;
ResourceString
sExceptionMsg = '[Exception] TRunSocket::KickUser';
sKickUserMsg = '当前登录帐号正在其它位置登录,本机已被强行离线!!!';
begin
try
nCheckCode:=0;
for I := Low(g_GateArr) to High(g_GateArr) do begin
Gate:=@g_GateArr[I];
nCheckCode:=1;
if Gate.boUsed and (Gate.Socket <> nil) and (Gate.UserList <> nil) then begin
nCheckCode:=2;
EnterCriticalSection(m_RunSocketSection);
try
nCheckCode:=3;
for II := 0 to Gate.UserList.Count - 1 do begin
nCheckCode:=4;
GateUserInfo:=Gate.UserList.Items[II];
if GateUserInfo = nil then Continue;
nCheckCode:=5;
if (GateUserInfo.sAccount = sAccount) or (GateUserInfo.nSessionID = nSessionID) then begin
nCheckCode:=6;
if GateUserInfo.FrontEngine <> nil then begin
nCheckCode:=7;
TFrontEngine(GateUserInfo.FrontEngine).DeleteHuman(I,GateUserInfo.nSocket);
end;
nCheckCode:=8;
if GateUserInfo.PlayObject <> nil then begin
nCheckCode:=9;
TPlayObject(GateUserInfo.PlayObject).SysMsg(sKickUserMsg,c_Red,t_Hint);
TPlayObject(GateUserInfo.PlayObject).m_boEmergencyClose:=True;
TPlayObject(GateUserInfo.PlayObject).m_boSoftClose:=True;
//SendOutConnectMsg(I,GateUserInfo.nSocket);
end;
nCheckCode:=10;
Dispose(GateUserInfo);
nCheckCode:=11;
Gate.UserList.Items[II]:=nil;
nCheckCode:=12;
Dec(Gate.nUserCount);
break;
end;
end;
nCheckCode:=13;
finally
LeaveCriticalSection(m_RunSocketSection);
end;
nCheckCode:=14;
end;
end;
except
on e: Exception do begin
MainOutMessage(format(sExceptionMsg,[nCheckCode]));
MainOutMessage(E.Message);
end;
end;
end;
function TRunSocket.GetGateAddr(sIPaddr: String):String;//004DFBE0
var
I: Integer;
begin
Result:=sIPaddr;
for I := 0 to n8 - 1 do begin
if m_IPaddrArr[I].sIpaddr = sIPaddr then begin
Result:=m_IPaddrArr[I].dIPaddr;
break;
end;
end;
end;
procedure TRunSocket.Execute;
begin
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
if (nRunSocketRun >= 0) and Assigned(PlugProcArray[nRunSocketRun].nProcAddr) then begin
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
TClassProc(PlugProcArray[nRunSocketRun].nProcAddr)(Self);
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
end;
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
end;
initialization
begin
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
AddToProcTable(@TRunSocket.Run,DecodeString('QAEqWaIkTriaY>uNYRt'){'TRunSocket.Run'});
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
AddToProcTable(@TRunSocket.ExecGateBuffers,DecodeString('QAEqWaIkTriaY>uAZBQ_MrApUPEqUbUaXcH'){'TRunSocket.ExecGateBuffers'});
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
nRunSocketRun:=AddToPulgProcTable(DecodeString('QAEqWaIkTriaY>uNYRt'){'TRunSocket.Run'});
{$IF DEBUG = 0}
asm
jz @@Start
jnz @@Start
db 0E8h
@@Start:
end;
{$IFEND}
end;
finalization
begin
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -