📄 usrsoc.pas
字号:
unit UsrSoc;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, IniFiles, Grobal2,
DBShare,StrUtils,mylist,
D7ScktComp;
type
TFrmUserSoc = class(TForm)
UserSocket: TServerSocket;
Timer1: TTimer;
ClientSocket1: TClientSocket;
Timer2: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure UserSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure UserSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure UserSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure UserSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Timer2Timer(Sender: TObject);
private
dwKeepAliveTick: LongWord; //0x10
CS_GateSession: TCriticalSection; //0x2D8
n2DC: Integer;
n2E0: Integer;
n2E4: Integer;
GateList:Array[0..9] of TGateinfo; //0x2E8
CurGate: integer; //0x51C
sDBReciveText:string;
function LoadChrNameList(sFileName: string): Boolean;
procedure ProcessGateMsg(GateIndex:Integer);
procedure SendKeepAlivePacket(Socket: TCustomWinSocket);
procedure ProcessUserMsg(var UserInfo: TUserInfo);
procedure CloseUser(sID: string; GateIndex:Integer);
procedure OpenUser(sID, sIP: string; GateIndex:Integer);
procedure DeCodeUserMsg(sData: string; var UserInfo: TUserInfo);
function QueryChr(sData: string; var UserInfo: TUserInfo): Boolean;
procedure DelChr(sData: string; var UserInfo: TUserInfo);
procedure OutOfConnect(const UserInfo: TUserInfo);
procedure newchr(sData: string; var UserInfo: TUserInfo);
function SelectChr(sData: string; var UserInfo: TUserInfo): Boolean;
procedure SendUserSocket(Socket: TCustomWinSocket; sSessionID,sSendMsg: string);
function GateRoutePort(sGateIP: string): Integer;
function CheckDenyChrName(sChrName: string): Boolean;
{ Private declarations }
public
function GateRouteIP(sGateIP: string; var nPort: Integer): string;
procedure LoadServerInfo();
function GetUserCount(): Integer;
function GetDBSockMsg(var Msg:TDefaultMessage;TimeOut:LongWord):Boolean;
function SendDBSockMsg(sMsg:String):Boolean;
function CheckGuildName(GuildName:String):Boolean;
{ Public declarations }
end;
var
FrmUserSoc : TFrmUserSoc;
ShowErrorMsg : Boolean;
implementation
uses HUtil32, IDSocCli, EDcode, MudUtil, DBSMain,
DataSQL_DB;
{$R *.DFM}
procedure TFrmUserSoc.UserSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
//0x004A2A10
var
sIPaddr : string;
i ,ii : Integer;
Find : Boolean;
begin
sIPaddr := Socket.RemoteAddress;
if not CheckServerIP(sIPaddr) then
begin
OutMainMessage('非法网关连接: ' + sIPaddr);
Socket.Close;
exit;
end;
Find:=False;
if not boOpenDBBusy then
begin
for i:=0 to 9 do
Begin
if not GateList[i].IsUsed then
Begin
Socket.nIndex:=i;
GateList[i].Socket := Socket;
GateList[i].sGateaddr := sIPaddr;
GateList[i].sText := '';
GateList[i].dwTick10 := GetTickCount();
GateList[i].nGateID := GetGateID(sIPaddr);
for ii:=0 to UserCount do
Begin
GateList[i].UserList[ii].IsUsered:=False;
GateList[i].Count:=0;
End;
GateList[i].IsUsed:=True;
Find:=True;
Break;
End;
End;
if not Find then
Socket.Close;
end
else
begin
Socket.Close;
end;
end;
procedure TFrmUserSoc.UserSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
//0x004A2B08
var
i, ii : Integer;
begin
try
CS_GateSession.Enter;
if Socket.nIndex in [0..9] then
Begin
GateList[socket.nIndex].IsUsed:=False;
GateList[socket.nIndex].Socket:=nil;
GateList[socket.nIndex].sText:='';
GateList[socket.nIndex].sReceiveText:='';
GateList[socket.nIndex].Count:=0;
End;
finally
CS_GateSession.Leave;
end;
end;
procedure TFrmUserSoc.UserSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
//0x004A2C10
begin
ErrorCode := 0;
Socket.Close;
end;
procedure TFrmUserSoc.UserSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i : Integer;
sReviceMsg : string;
GateIndex : Integer;
begin
try
CS_GateSession.Enter;
GateIndex:=Socket.nIndex;
if GateIndex in [0..9] then
GateList[GateIndex].sReceiveText:=GateList[GateIndex].sReceiveText+Socket.ReceiveText;
finally
CS_GateSession.Leave;
end;
end;
procedure TFrmUserSoc.FormCreate(Sender: TObject);
var
i : Integer;
//0x004A2898
begin
CS_GateSession := TCriticalSection.Create;
for i:=0 to 9 do
Begin
GateList[i].IsUsed:=False;
GateList[i].Socket:=nil;
End;
UserSocket.Port := g_nGatePort;
UserSocket.Address := g_sGateAddr;
UserSocket.Active := True;
ShowErrorMsg :=False;
ClientSocket1.Port:=g_nRemotPort;
ClientSocket1.Active:=True;
LoadServerInfo();
LoadChrNameList('DenyChrName.txt');
end;
procedure TFrmUserSoc.FormDestroy(Sender: TObject);
var
i : Integer;
begin
CS_GateSession.Free;
end;
procedure TFrmUserSoc.Timer1Timer(Sender: TObject);
//0x004A4EFC
var
n8 : Integer;
begin
{ n8 := g_nQueryChrCount + nHackerNewChrCount + nHackerDelChrCount +
nHackerSelChrCount + n4ADC1C + n4ADC20 + n4ADC24 + n4ADC28;
if n4ADBB8 <> n8 then
begin
n4ADBB8 := n8;
OutMainMessage('H-QyChr=' + IntToStr(g_nQueryChrCount) + ' ' +
'H-NwChr=' + IntToStr(nHackerNewChrCount) + ' ' +
'H-DlChr=' + IntToStr(nHackerDelChrCount) + ' ' +
'Dubl-Sl=' + IntToStr(nHackerSelChrCount) + ' ' +
'H-Er-P1=' + IntToStr(n4ADC1C) + ' ' +
'Dubl-P2=' + IntToStr(n4ADC20) + ' ' +
'Dubl-P3=' + IntToStr(n4ADC24) + ' ' +
'Dubl-P4=' + IntToStr(n4ADC28));
end;
}
if not ClientSocket1.Active then
ClientSocket1.Active:=True;
end;
function TFrmUserSoc.GetUserCount(): Integer;
var
i : Integer;
nUserCount : Integer;
begin
nUserCount := 0;
try
CS_GateSession.Enter;
for i := 0 to 9 do
begin
if GateList[i].IsUsed then
Inc(nUserCount, GateList[i].Count);
end;
finally
CS_GateSession.Leave;
end;
Result := nUserCount;
end;
procedure TFrmUserSoc.LoadServerInfo;
//0x004A2018
var
i : Integer;
LoadList : TStringList;
nRouteIdx, nGateIdx : Integer;
sLineText, sSelGateIPaddr, sGameGateIPaddr, sGameGate, sGameGatePort:string;
begin
try
LoadList := TStringList.Create;
FillChar(g_RouteInfo, SizeOf(g_RouteInfo), #0);
LoadList.LoadFromFile(sGateConfFileName);
nRouteIdx := 0;
nGateIdx := 0;
for i := 0 to LoadList.Count - 1 do
begin
sLineText := Trim(LoadList.Strings[i]);
if (sLineText <> '') and (sLineText[1] <> ';') then
begin
sGameGate := GetValidStr3(sLineText, sSelGateIPaddr, [' ', #9]);
if (sGameGate = '') or (sSelGateIPaddr = '') then
Continue;
g_RouteInfo[nRouteIdx].sSelGateIP := Trim(sSelGateIPaddr);
g_RouteInfo[nRouteIdx].nGateCount := 0;
nGateIdx := 0;
while (sGameGate <> '') do
begin
sGameGate := GetValidStr3(sGameGate, sGameGateIPaddr, [' ', #9]);
sGameGate := GetValidStr3(sGameGate, sGameGatePort, [' ', #9]);
g_RouteInfo[nRouteIdx].sGameGateIP[nGateIdx] := Trim(sGameGateIPaddr);
g_RouteInfo[nRouteIdx].nGameGatePort[nGateIdx] :=
Str_ToInt(sGameGatePort, 0);
Inc(nGateIdx);
end;
g_RouteInfo[nRouteIdx].nGateCount := nGateIdx;
Inc(nRouteIdx);
end;
end;
finally
end;
end;
function TFrmUserSoc.LoadChrNameList(sFileName: string): Boolean;
//0x0045C1A0
var
i : Integer;
begin
Result := False;
if FileExists(sFileName) then
begin
DenyChrNameList.LoadFromFile(sFileName);
i := 0;
while (True) do
begin
if DenyChrNameList.Count <= i then
break;
if Trim(DenyChrNameList.Strings[i]) = '' then
begin
DenyChrNameList.Delete(i);
Continue;
end;
Inc(i);
end;
Result := True;
end;
end;
procedure TFrmUserSoc.ProcessGateMsg(GateIndex:Integer);
//0x004A3350
var
s0C : string;
s10 : string;
ss : string;
s19 : Char;
i : Integer;
UserInfo : TUserInfo;
len : array[0..0] of LongWord;
begin
if not (GateIndex in [0..9]) then exit;
while (GateList[GateIndex].IsUsed)and(GateList[GateIndex].sText <> '') do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -