📄 runsock.~pas
字号:
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
// AddMainLogMsg(tMsg);
if GateUser.sAccount = '' then begin
if TagCount(sMsg,'!') > 0 then begin
sData := ArrestStringEx (sMsg, '#', '!', sMsg);
sMsg:=Copy(sMsg,2,Length(sMsg)-1);
// MainOutMessage('1 ' + sMsg);
if GetCertification(sMsg,sAccount,sChrName,nSessionID,nClientVersion,boFlag) then begin
if ScanCertification(sAccount,sChrName,nSessionID,nClientVersion) then exit;
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
//测试
Gate.UserList.Delete(I);
break;
//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
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//004E1464
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);
end;
GM_CHECKCLIENT{4}: begin//004E14DC
nCheckCode := 3;
Gate.boSendKeepAlive:=True;
end;
GM_RECEIVE_OK{7}: begin//004E14EF
nCheckCode := 4;
Gate.nSendChecked := 0;
Gate.nSendBlockCount := 0;
end;
GM_DATA{5}: begin//004E150B
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -