📄 runsock.~pas
字号:
GateUser.SessInfo := SessInfo;
try //004E11C9
FrontEngine.AddToLoadRcdList(sAccount,
sChrName,
GateUser.sIPaddr,
boFlag,
nSessionID,
nPayMent,
nPayMode,
nClientVersion,
nSocket,
GateUser.nGSocketIdx,
GateIdx);
except
MainOutMessage(format(sExceptionMsg, [nCheckCode]));
end;
end;
end else begin
GateUser.boCertification := True;
GateUser.sAccount := Trim(sAccount);
GateUser.sCharName := Trim(sChrName);
GateUser.nSessionID := nSessionID;
GateUser.nClientVersion := nClientVersion;
GateUser.SessInfo := SessInfo;
try //004E11C9
FrontEngine.AddToLoadRcdList(sAccount,
sChrName,
GateUser.sIPaddr,
boFlag,
nSessionID,
nPayMent,
nPayMode,
nClientVersion,
nSocket,
GateUser.nGSocketIdx,
GateIdx);
except
MainOutMessage(format(sExceptionMsg, [nCheckCode]));
end;
end;
end else begin
nCheckCode := 2;
GateUser.sAccount := sDisable;
GateUser.boCertification := False;
CloseUser(GateIdx, nSocket);
nCheckCode := 3;
end;
end else begin
nCheckCode := 4;
GateUser.sAccount := sDisable;
GateUser.boCertification := False;
CloseUser(GateIdx, nSocket);
nCheckCode := 5;
end;
end;
end;
except
MainOutMessage(format(sExceptionMsg, [nCheckCode]));
end;
end;
function TRunSocket.SendGateBuffers(GateIdx: Integer; Gate: pTGateInfo; MsgList: TList): Boolean; //004E1930
var
dwRunTick: LongWord;
BufferA: PChar;
BufferB: PChar;
BufferC: PChar;
i: Integer;
nBuffALen: Integer;
nBuffBLen: Integer;
nBuffCLen: Integer;
nSendBuffLen: Integer;
resourcestring
sExceptionMsg1 = '[Exception] TRunSocket::SendGateBuffers -> ProcessBuff';
sExceptionMsg2 = '[Exception] TRunSocket::SendGateBuffers -> SendBuff';
begin
Result := True;
if MsgList.Count = 0 then Exit;
dwRunTick := GetTickCount();
//如果网关未回复状态消息,则不再发送数据
if Gate.nSendChecked > 0 then begin
if (GetTickCount - Gate.dwSendCheckTick) > g_dwSocCheckTimeOut {2 * 1000} then begin
Gate.nSendChecked := 0;
Gate.nSendBlockCount := 0;
end;
Exit;
end;
//将小数据合并为一个指定大小的数据
{$IF CATEXCEPTION = TRYEXCEPTION}
try
{$IFEND}
i := 0;
BufferA := MsgList.Items[i];
while (True) do begin
if (i + 1) >= MsgList.Count then break;
BufferB := MsgList.Items[i + 1];
Move(BufferA^, nBuffALen, SizeOf(Integer));
Move(BufferB^, nBuffBLen, SizeOf(Integer));
if (nBuffALen + nBuffBLen) < g_Config.nSendBlock then begin
MsgList.Delete(i + 1);
try
GetMem(BufferC, nBuffALen + SizeOf(Integer) + nBuffBLen);
except
BufferC := nil;
end;
if BufferC <> nil then begin
nBuffCLen := nBuffALen + nBuffBLen;
Move(nBuffCLen, BufferC^, SizeOf(Integer));
Move(BufferA[SizeOf(Integer)], PChar(BufferC + SizeOf(Integer))^, nBuffALen);
Move(BufferB[SizeOf(Integer)], PChar(BufferC + nBuffALen + SizeOf(Integer))^, nBuffBLen);
FreeMem(BufferA);
FreeMem(BufferB);
BufferA := BufferC;
MsgList.Items[i] := BufferA;
Continue;
end;
end;
Inc(i);
BufferA := BufferB;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
except
on E: Exception do begin
MainOutMessage(sExceptionMsg1);
MainOutMessage(E.Message);
end;
end;
{$IFEND}
{$IF CATEXCEPTION = TRYEXCEPTION}
try
{$IFEND}
while MsgList.Count > 0 do begin
BufferA := MsgList.Items[0];
if BufferA = nil then begin
MsgList.Delete(0);
Continue;
end;
Move(BufferA^, nSendBuffLen, SizeOf(Integer));
if (Gate.nSendChecked = 0) and ((Gate.nSendBlockCount + nSendBuffLen) >= g_Config.nCheckBlock) then begin
if (Gate.nSendBlockCount = 0) and (g_Config.nCheckBlock <= nSendBuffLen) then begin
MsgList.Delete(0); //如果数据大小超过指定大小则扔掉(编辑数据比较大,与此有点关系)
FreeMem(BufferA);
end else begin
SendCheck(Gate.Socket, GM_RECEIVE_OK);
Gate.nSendChecked := 1;
Gate.dwSendCheckTick := GetTickCount();
end;
break;
end;
MsgList.Delete(0);
BufferB := BufferA + SizeOf(Integer);
if nSendBuffLen > 0 then begin
while (True) do begin
if g_Config.nSendBlock <= nSendBuffLen then begin
if Gate.Socket <> nil then begin
if Gate.Socket.Connected then begin
Gate.Socket.SendBuf(BufferB^, g_Config.nSendBlock);
end; //004E1BC9
Inc(Gate.nSendCount);
Inc(Gate.nSendBytesCount, g_Config.nSendBlock);
end; //004E1BDC
Inc(Gate.nSendBlockCount, g_Config.nSendBlock);
BufferB := @BufferB[g_Config.nSendBlock];
Dec(nSendBuffLen, g_Config.nSendBlock);
Continue;
end; //004E1C05
if Gate.Socket <> nil then begin
if Gate.Socket.Connected then begin
Gate.Socket.SendBuf(BufferB^, nSendBuffLen);
end;
Inc(Gate.nSendCount);
Inc(Gate.nSendBytesCount, nSendBuffLen);
Inc(Gate.nSendBlockCount, nSendBuffLen);
end;
nSendBuffLen := 0;
break;
end;
end;
FreeMem(BufferA);
if (GetTickCount - dwRunTick) > g_dwSocLimit then begin
Result := False;
break;
end;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
except
on E: Exception do begin
MainOutMessage(sExceptionMsg2);
MainOutMessage(E.Message);
end;
end;
{$IFEND}
end;
procedure TRunSocket.CloseUser(GateIdx, nSocket: Integer);
var
i: Integer;
GateUser: pTGateUserInfo;
tStr: string;
Gate: pTGateInfo;
resourcestring
sExceptionMsg0 = '[Exception] TRunSocket::CloseUser 0';
sExceptionMsg1 = '[Exception] TRunSocket::CloseUser 1';
sExceptionMsg2 = '[Exception] TRunSocket::CloseUser 2';
sExceptionMsg3 = '[Exception] TRunSocket::CloseUser 3';
sExceptionMsg4 = '[Exception] TRunSocket::CloseUser 4';
begin
if GateIdx <= High(g_GateArr) then begin
Gate := @g_GateArr[GateIdx];
if Gate.UserList <> nil then begin
EnterCriticalSection(m_RunSocketSection);
try
try
for i := 0 to Gate.UserList.Count - 1 do begin
if Gate.UserList.Items[i] <> nil then begin
GateUser := Gate.UserList.Items[i];
if GateUser.nSocket = nSocket then begin
{if GateUser.PlayObject <> nil then begin
if TPlayObject(GateUser.PlayObject).m_boNotOnlineAddExp then Break;
end;}
try
if GateUser.FrontEngine <> nil then begin
TFrontEngine(GateUser.FrontEngine).DeleteHuman(i, GateUser.nSocket);
end;
except
MainOutMessage(sExceptionMsg1);
end;
try
if TPlayObject(GateUser.PlayObject) <> nil then begin
TPlayObject(GateUser.PlayObject).m_boSoftClose := True;
end;
except
MainOutMessage(sExceptionMsg2);
end;
try
if (GateUser.PlayObject <> nil) and (TPlayObject(GateUser.PlayObject).m_boGhost) and (not TPlayObject(GateUser.PlayObject).m_boReconnection) then begin
FrmIDSoc.SendHumanLogOutmsg(GateUser.sAccount, GateUser.nSessionID);
end;
except
MainOutMessage(sExceptionMsg3);
end;
try
Dispose(GateUser);
//MainOutMessage('关闭用户: ' + IntToStr(nSocket));
Gate.UserList.Items[i] := nil;
Dec(Gate.nUserCount);
except
MainOutMessage(sExceptionMsg4);
end;
break;
end;
end;
end;
except
MainOutMessage(sExceptionMsg0);
end;
finally
LeaveCriticalSection(m_RunSocketSection);
end;
end;
end;
end;
function TRunSocket.OpenNewUser(nSocket: Integer; nGSocketIdx: Integer; sIPaddr: string; UserList: TList): Integer; //004E0364
var
GateUser: pTGateUserInfo;
i: Integer;
begin
New(GateUser);
GateUser.sAccount := '';
GateUser.sCharName := '';
GateUser.sIPaddr := sIPaddr;
GateUser.nSocket := nSocket;
GateUser.nGSocketIdx := nGSocketIdx;
GateUser.nSessionID := 0;
GateUser.UserEngine := nil;
GateUser.FrontEngine := nil;
GateUser.PlayObject := nil;
GateUser.dwNewUserTick := GetTickCount();
GateUser.boCertification := False;
for i := 0 to UserList.Count - 1 do begin
if UserList.Items[i] = nil then begin
UserList.Items[i] := GateUser;
Result := i;
Exit;
end;
end;
//MainOutMessage('连接用户: ' + IntToStr(nSocket));
UserList.Add(GateUser);
Result := UserList.Count - 1;
end;
procedure TRunSocket.SendNewUserMsg(Socket: TCustomWinSocket; nSocket: Integer; nSocketIndex, nUserIdex: Integer);
var
MsgHeader: TMsgHeader;
begin
if not Socket.Connected then Exit;
MsgHeader.dwCode := RUNGATECODE;
MsgHeader.nSocket := nSocket;
MsgHeader.wGSocketIdx := nSocketIndex;
MsgHeader.wIdent := GM_SERVERUSERINDEX;
MsgHeader.wUserListIndex := nUserIdex;
MsgHeader.nLength := 0;
if Socket <> nil then Socket.SendBuf(MsgHeader, SizeOf(TMsgHeader));
end;
procedure TRunSocket.ExecGateMsg(GateIdx: Integer; Gate: pTGateInfo; MsgHeader: pTMsgHeader; MsgBuff: PChar; nMsgLen: Integer);
var
nCheckCode: Integer;
nUserIdx: Integer;
sIPaddr: string;
GateUser: pTGateUserInfo;
i: Integer;
resourcestring
sExceptionMsg = '[Exception] TRunSocket::ExecGateMsg %d';
begin
nCheckCode := 0;
try
case MsgHeader.wIdent of
GM_OPEN {1}: begin
nCheckCode := 1;
sIPaddr := StrPas(MsgBuff);
nUserIdx := OpenNewUser(MsgHeader.nSocket, MsgHeader.wGSocketIdx, sIPaddr, Gate.UserList);
SendNewUserMsg(Gate.Socket, MsgHeader.nSocket, MsgHeader.wGSocketIdx, nUserIdx + 1);
Inc(Gate.nUserCount);
end;
GM_CLOSE {2}: begin
nCheckCode := 2;
CloseUser(GateIdx, MsgHeader.nSocket);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -