📄 runsock.pas
字号:
procedure TRunSocket.DoClientCertification(GateIdx: Integer; GateUser: pTGateUserInfo; nSocket: Integer; sMsg: string); //004E1028
function GetCertification(sMsg: string; var sAccount: string; var sChrName: string; var nSessionID: Integer; var nClientVersion: Integer; var boFlag: Boolean): Boolean; //004E0DE0
var
sData: string;
sCodeStr, sClientVersion: string;
sIdx: string;
resourcestring
sExceptionMsg = '[Exception] TRunSocket::DoClientCertification -> GetCertification';
begin
Result := False;
try
sData := DeCodeString(sMsg);
// MainOutMessage(sData);
if (Length(sData) > 2) and (sData[1] = '*') and (sData[2] = '*') then
begin
sData := Copy(sData, 3, Length(sData) - 2);
sData := GetValidStr3(sData, sAccount, ['/']);
sData := GetValidStr3(sData, sChrName, ['/']);
sData := GetValidStr3(sData, sCodeStr, ['/']);
sData := GetValidStr3(sData, sClientVersion, ['/']);
sIdx := sData;
nSessionID := Str_ToInt(sCodeStr, 0);
if sIdx = '0' then
begin
boFlag := True;
end else
begin //004E0F37
boFlag := False;
end;
if (sAccount <> '') and (sChrName <> '') and (nSessionID >= 2) then
begin
nClientVersion := Str_ToInt(sClientVersion, 0);
Result := True;
end;
end; //004E0F68
except
MainOutMessage(sExceptionMsg);
end;
end;
var
nCheckCode: Integer;
sData: string;
sAccount, sChrName: string;
nSessionID: Integer;
boFlag: Boolean;
nClientVersion: Integer;
nPayMent, nPayMode: Integer;
SessInfo: pTSessInfo;
resourcestring
sExceptionMsg = '[Exception] TRunSocket::DoClientCertification CheckCode: ';
sDisable = '*disable*';
begin
nCheckCode := 0;
try
if GateUser.sAccount = '' then
begin
if TagCount(sMsg, '!') > 0 then
begin
sData := ArrestStringEx(sMsg, '#', '!', sMsg);
sMsg := Copy(sMsg, 2, Length(sMsg) - 1);
if GetCertification(sMsg, sAccount, sChrName, nSessionID, nClientVersion, boFlag) then
begin
SessInfo := FrmIDSoc.GetAdmission(sAccount, GateUser.sIPaddr, nSessionID, nPayMode, nPayMent);
if (SessInfo <> nil) and (nPayMent > 0) then
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 else
begin //004E1244
nCheckCode := 2;
GateUser.sAccount := sDisable;
GateUser.boCertification := False;
CloseUser(GateIdx, nSocket);
nCheckCode := 3;
end;
end else
begin //004E1276
nCheckCode := 4;
GateUser.sAccount := sDisable;
GateUser.boCertification := False;
CloseUser(GateIdx, nSocket);
nCheckCode := 5;
end;
end;
end; //004E12A6
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; //004E198F
//将小数据合并为一个指定大小的数据
{$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);
GetMem(BufferC, nBuffALen + SizeOf(Integer) + nBuffBLen);
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;
Inc(i);
BufferA := BufferB;
end; //004E1A9D
{$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; //004E1B75
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; //004E1C54
FreeMem(BufferA);
if (GetTickCount - dwRunTick) > g_dwSocLimit then
begin
Result := False;
Break;
end;
end; //004E1C74
{$IF CATEXCEPTION = TRYEXCEPTION}
except
on E: Exception do
begin
MainOutMessage(sExceptionMsg2);
MainOutMessage(E.Message);
end;
end;
{$IFEND}
//004E1C9F
end;
procedure TRunSocket.CloseUser(GateIdx, nSocket: Integer); //004E0490
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
//004E0595
try
if GateUser.FrontEngine <> nil then
begin
TFrontEngine(GateUser.FrontEngine).DeleteHuman(i, GateUser.nSocket);
end;
except
MainOutMessage(sExceptionMsg1);
end;
//004E05DE
try
if GateUser.PlayObject <> nil then
begin
TPlayObject(GateUser.PlayObject).m_boSoftClose := True;
end;
except
MainOutMessage(sExceptionMsg2);
end;
//004E0620
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;
//004E0693
try
Dispose(GateUser);
//MainOutMessage('关闭用户: ' + IntToStr(nSocket));
//02/04 Jacky
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;
//MainOutMessage('连接用户: ' + IntToStr(nSocket));
Exit;
end;
end;
//MainOutMessage('连接用户: ' + IntToStr(nSocket));
UserList.Add(GateUser);
Result := UserList.Count - 1;
end;
//004E09D0
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;
//004E13EC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -