runsock.pas
来自「FIR引擎最新源码+注册」· PAS 代码 · 共 1,348 行 · 第 1/4 页
PAS
1,348 行
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
if GetTickCount - GateUser.dwNewUserTick < 1000 * 20 then begin
DoClientCertification(GateIdx, GateUser, MsgHeader.nSocket, StrPas(MsgBuff));
end else begin //2007-01-21增加 20秒内没登陆成功踢下线
CloseUser(GateIdx, MsgHeader.nSocket);
SendOutConnectMsg(GateIdx, MsgHeader.nSocket, GateUser.nGSocketIdx);
end;
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();
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);
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 CheckCode: %d';
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;
TPlayObject(GateUserInfo.PlayObject).m_boPlayOffLine := False;
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.
>= 0) and Assigned(PlugProcArray[nRunSocketRun].nProcAddr) then begin
TClassProc(PlugProcArray[nRunSocketRun].nProcAddr)(Self);
end;
end;
initialization
begin
AddToProcTable(@TRunSocket.Run, 'TRunSocket.Run', 119);
nRunSocketRun := AddToPulgProcTable('TRunSocket.Run', 911);
end;
finalization
begin
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?