📄 runsock.~pas
字号:
end;
GM_CHECKCLIENT {4}: begin
nCheckCode := 3;
Gate.boSendKeepAlive := True;
end;
GM_RECEIVE_OK {7}: begin
nCheckCode := 4;
Gate.nSendChecked := 0;
Gate.nSendBlockCount := 0;
end;
GM_DATA {5}: begin
nCheckCode := 5;
GateUser := nil;
if MsgHeader.wUserListIndex >= 1 then begin
nUserIdx := MsgHeader.wUserListIndex - 1;
if Gate.UserList.Count > nUserIdx then begin
GateUser := Gate.UserList.Items[nUserIdx];
if (GateUser <> nil) and (GateUser.nSocket <> MsgHeader.nSocket) then begin
GateUser := nil;
end;
end;
end;
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
UserEngine.ProcessUserMessage(TPlayObject(GateUser.PlayObject), pTDefaultMessage(MsgBuff), @MsgBuff[SizeOf(TDefaultMessage)]);
end;
end;
end else begin
DoClientCertification(GateIdx, GateUser, MsgHeader.nSocket, StrPas(MsgBuff));
end;
end;
end;
end;
except
MainOutMessage(format(sExceptionMsg, [nCheckCode]));
end;
end;
procedure TRunSocket.SendCheck(Socket: TCustomWinSocket; nIdent: Integer);
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();
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();
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;
m_nErrorCount := 0;
LoadRunAddr();
n4F8 := 0;
end;
destructor TRunSocket.Destroy;
begin
m_RunAddrList.Free;
DeleteCriticalSection(m_RunSocketSection);
inherited;
end;
function TRunSocket.AddGateBuffer(GateIdx: Integer; Buffer: PChar): Boolean;
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);
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
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
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;
end;
if not RunSocket.AddGateBuffer(nGateIdx, Buff) then begin
FreeMem(Buff);
end;
end;
procedure TRunSocket.SetGateUserList(nGateIdx, nSocket: Integer; PlayObject: TPlayObject);
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);
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
if not TPlayObject(GateUserInfo.PlayObject).m_boNotOnlineAddExp 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;
end;
//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;
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
Run;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -