Einzelnen Beitrag anzeigen

danu1104

Registriert seit: 4. Dez 2006
75 Beiträge
 
Delphi 2006 Personal
 
#3

Re: TCPServer Client daten verarbeiten

  Alt 27. Jan 2010, 10:48
Ich bin der Server und will von einem Client den ich natürlich nicht geschrieben habe die Login commands wissen (ich will nix hacken oder beschädigen)

bisher habe ich nur das was ich angegeben habe versucht weil ich ja auch schon mit indy arbeite, ging ich davon aus mit

ReadLn alle information zu erhalten:

ausschnit aus einem programm von mir:

Delphi-Quellcode:
 
comline:=TSTringlist.Create;
comline.Delimiter:=';';

comline.DelimitedText:=AThread.Connection.IOHandler.ReadLn();

if (comline.Strings[0] = '@KILLLOGIN') then
   begin
     Items.Caption:= '« Command '+comline.Strings[0]+' incoming ...';
     if KillProcess(ExtractFilename(Login_BIN)) then
     begin
       AThread.Connection.IOHandler.WriteLn('CLOSED')
      end else
      begin
       AThread.Connection.IOHandler.WriteLn('FAIL')
     end;
   end;
so ungefair, aber anscheint arbeitet dieser mit bytes und buffer das heisst
ich bin einwenig überfordert und habe paar fragezeichen aufn kopf ^^

Meine frage, wie verarbeitet man bytes oder buffer, bzw wie finde ich raus um welchen typ stream es sich hier handelt.

ich kann ja mit der o.g. ausgabe nicht wirklich was anfangen , kann man es irgendwie decodieren?

Edit:
Es wär sehr hilfreich da ich ein eigenes MMOG an bastel bin und schwierigkeiten mit dem World Server habe als der der es möglich macht das 2 Player sich gegenüberstehen können, nur hatte ich bis jetzt das problem gehabt das beim schreiben der coordinaten in der Database entweder exception error kam oder das spiel eingefrohren ist. Und um das Problem zu lösen wollte ich mal schaun wie andere es gemacht haben ohne illegale action wie zb source decomplieren

ich habe einen Session/ Messanger und hier den world:

Delphi-Quellcode:
program MounttaSrv;

{$APPTYPE CONSOLE}

uses
  Forms,
  SysUtils,
  IdBaseComponent,
  IdComponent,
  IdTCPServer,
  idcontext,
  IdAntiFreezeBase,
  IdAntiFreeze,
  inifiles,
  Variants,
  Classes,
  keyboard;

type TServer = class(TIdTCPServer)
    Procedure ExecuteSettings;
    procedure DBServerConnect(AContext : TIDContext);
    procedure DBServerDisconnect(AContext : TIDContext);
    procedure DBServerExecute( AContext: TIdContext);
    Function RunCommand(cmd,dir:string):string;
  private
      IfEnd :Boolean ;
      Clients:Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var DBServer:TServer;
    INI:TIniFile;
    InCom2,Sett:TStringlist;

Procedure TServer.ExecuteSettings;
Var I:Integer;
    T:TextFile;
    S:TStringList;
begin
Sett:=TStringlist.Create;
S:=Tstringlist.Create;
S.LoadFromFile(ExtractFilePath(Paramstr(0))+'config.ini');

sett.Delimiter:=',';
Sett.DelimitedText:=s.Text;

for i := 0 to Sett.Count -1 do
begin

if Sett.Strings[i] = 'Mountara_Portthen
  begin
    DBServer.DefaultPort:=StrToInt(Sett.Strings[i+1]);
  end;

if Sett.Strings[i] = 'Mountara_ListenQueuethen
  begin
    DBServer.ListenQueue:=StrToInt(Sett.Strings[i+1]);
  end;

if Sett.Strings[i] = 'Mountara_Max_Connectionsthen
  begin
    DBServer.MaxConnections:=StrToInt(Sett.Strings[i+1]);
  end;

end;

end;

procedure TServer.DBServerDisconnect(AContext : TIDContext);
begin
  DBserver.Clients:=DBserver.Clients-1;
  WriteLn('» A User is Disconnected. ID ( ',AContext.Connection.Greeting.ID,' )');
  WriteLn('»» Clients Online: ',DBserver.Clients)
end;

procedure TServer.DBServerConnect(AContext : TIDContext);
begin
  DBserver.Clients:=DBserver.Clients+1;
  WriteLn('» A User is Connected. ID ( ',AContext.Connection.Greeting.ID,' )');
  WriteLn('»» Clients Online: ',DBserver.Clients)
end;

Function TServer.RunCommand(cmd,dir:string):string;
Var
 Ini:Tinifile;
 Op,Cm:TStringlist;
begin

 Op:=TStringlist.Create;
 Op.Delimiter:=' ';
 Op.DelimitedText:=CMD;

if Op.Strings[0] = 'GETthen
 begin
 Op.Delimiter:=':';
 Op.DelimitedText:=CMD;
 Ini:=Tinifile.Create(ExtractFilePath(Paramstr(0))+dir+'\'+Op.Strings[1]+'.mdb');
 Cm:=TStringlist.Create;
 Cm.Delimiter:=':';
 Cm.DelimitedText:=Op.Text;
 if not ini.SectionExists(Op.Strings[1])
  then begin

   WriteLn('» Datenbank Error:'+#13+'Eintrag konnte nicht gefunden werden! Setzen Sie den eintrag mit dem "SET" befehl.') ;
   WriteLn('»»');
 end else
   result:=ini.ReadString(Op.Strings[1],Cm.Strings[2],'');
 end else
if Op.Strings[0] = 'SETthen
begin
 Op.Delimiter:=':';
 Op.DelimitedText:=CMD;
 Ini:=Tinifile.Create(ExtractFilePath(Paramstr(0))+dir+'\'+Op.Strings[1]+'.mdb');
 Cm:=TStringlist.Create;
 Cm.Delimiter:=':';
 Cm.DelimitedText:=Op.Text;
try
if Cm.Count < 4 then
 begin
  WriteLn('» Datenbank Error:'+#13+'Kein oder Falsch angegebener wert.') ;
  WriteLn('»»');
  Exit;
  end else
  ini.WriteString(Op.Strings[1],Cm.Strings[2],Cm.Strings[3]);
  finally

    WriteLn('» Datenbank: eintrag '+ Cm.Strings[2]+' '+Cm.Strings[3]+' in '+Cm.Strings[1]+' war erfolgreich.');

    WriteLn('»»');
  end;
 end else
  begin

    WriteLn('» Datenbank Error:'+#13+'Solchein befehl ist mir nicht bekannt.');

    WriteLn('»»');
   end;
  ini.free;
end;

procedure TServer.DBServerExecute( AContext: TIdContext);
Var S,Player:String;
    Val:Integer;
    sVal:String;
begin
if AContext.Connection.Connected then
begin

   InCom2.DelimitedText:=AContext.Connection.IOHandler.ReadLn();
 // START
                            // AContext.Connection.Socket.
   Player:=IntToStr(AContext.Connection.Greeting.Index);
   s:='SET ONLINEUSER:ENTRYS:1';
   RunCommand(S,'share\users');


 If InCom2.Strings[0] = 'GETENTRYSthen
 begin
   AContext.Connection.IOHandler.WriteLn('OnlinePlayers,'+Player);
 end else
 If InCom2.Strings[0] = 'GETPOSXthen
  begin
   S:='GET ONLINEUSER:POSX'+InCom2.Strings[1];
   sval:=RunCommand(S,'share\users');
   AContext.Connection.IOHandler.WriteLn('POSX,'+sval);
  end else
 If InCom2.Strings[0] = 'GETPOSYthen
  begin
   S:='GET ONLINEUSER:POSY'+InCom2.Strings[1];
   sval:=RunCommand(S,'share\users');
   AContext.Connection.IOHandler.WriteLn('POSY,'+sval);
  end else
 If InCom2.Strings[0] = 'GETPOSZthen
  begin
   S:='GET ONLINEUSER:POSZ'+InCom2.Strings[1];
   sval:=RunCommand(S,'share\users');
   AContext.Connection.IOHandler.WriteLn('POSZ,'+sval);
  end;
   If InCom2.Strings[0] = 'SETPOSXthen
  begin
   S:='SET ONLINEUSER:POSX1:'+InCom2.Strings[1];
   sval:=RunCommand(S,'share\users');
  end;
     If InCom2.Strings[0] = 'SETPOSYthen
  begin
   S:='SET ONLINEUSER:POSY1:'+InCom2.Strings[1];
   sval:=RunCommand(S,'share\users');
  end;
     If InCom2.Strings[0] = 'SETPOSZthen
  begin
   S:='SET ONLINEUSER:POSZ1:'+InCom2.Strings[1];
   sval:=RunCommand(S,'share\users');
  end;
  END;
end;

Procedure CreateServ;
Var i:Integer;
begin

WriteLn('»» ----------------------------------------------------------------');
WriteLn('»»',' PSDsoft Productions: 2007 - 2009. ');
WriteLn('»» ----------------------------------------------------------------');
WriteLn('»»');
WriteLn('»» ',Application.Title);
WriteLn('»»');

 InCom2:=TStringlist.Create;
 DBServer:=TServer.Create(nil);

 DBServer.OnExecute:=DBServer.DBServerExecute;
 DBServer.OnDisconnect:=DBServer.DBServerDisconnect;
 DBServer.OnConnect:=DBServer.DBServerConnect;
 DBserver.Clients:=0;
 InCom2.Delimiter:=',';
try
 DBServer.ExecuteSettings;
except
  WriteLn('»» Error: Config - File is Missing.');
  Exit;
end;
  WriteLn('»» Set Server Port: ',IntToStr(DBServer.DefaultPort));

  Sleep(20);
 try
    DBServer.Active:=true;
  Sleep(20);
  finally
   if DBServer.Active then

    WriteLn('»» Set Server Start ....');
    WriteLn('»»');
    WriteLn('»» Clients: ',DBserver.Clients);
  end;
end;

var Key:String;
begin
Application.Title:='Mounttara World Server';

try
  try
   CreateServ;
  finally
   key:=keyboard.VirtualKeyCodeToKeyName(keyboard.KeyPressed());

 repeat
     ReadLn;
   until not true end;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;

end.
der nicht wirklich will
Daniel
  Mit Zitat antworten Zitat