AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Query an Gameserver

Query an Gameserver

Ein Thema von Flodding · begonnen am 18. Feb 2015 · letzter Beitrag vom 1. Nov 2015
Antwort Antwort
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Query an Gameserver

  Alt 22. Feb 2015, 19:47
Schnipsel abgeändert:
Delphi-Quellcode:
type
  TBytes = Array of Byte;
  TValveByte = Byte; {8 bit character or unsigned integer}
  TValveShort = SmallInt; {16 bit signed integer}
  TValveLong = Integer; {32 bit signed integer}
  TValveFloat = Single; {32 bit floating point}
  TValveLongLong = Cardinal; {64 bit unsigned integer}

const
  SIMPLE_RESPONSE_HEADER : TValveLong = $FFFFFFFF;
  MULTIPACKET_RESPONSE_HEADER : TValveLong = $FFFFFFFE;

procedure Foo(AResponse : Array of Byte);
var
  LResponseStream : TStream;
  LHeader : TValveLong;
begin
  LResponseStream := TMemoryStream.Create();
  LResponseStream.Write(AResponse, Sizeof(AResponse));
  try
    LResponseStream.Read( LHeader, sizeof(LHeader) ); // Wir lesen den 4-Byte Header
    case LHeader of
      SIMPLE_RESPONSE_HEADER : ShowMessage('Simple Header'); <--- Fehler 1
// WorkOnSimpleResponse( LResponseStream ); <--- Fehler 2
      MULTIPACKET_RESPONSE_HEADER : ShowMessage('Multi Header'); <--- Fehler 1
// WorkOnMultiPacketResponse( LResponseStream ); <--- Fehler 2
    else
      raise Exception.CreateFmt( 'Unknown Header Value %8.8x', [LHeader] );
    end;
  finally
    LResponseStream.Free;
  end;
end;
1.) [Pascal Fehler] Unit4.pas(125): E2026 Konstantenausdruck erwartet
2.) Nicht deklarierter Bezeichner 'WorkOnSimpleResponse' / 'WorkOnMultiPacketResponse'

Zitat:
Man sieht sofort den Unterschied, da es in der Muttersprache geschrieben steht.
Entschuldige, dass ich Delphi nicht wie meine Muttersprache beherrsche.

Zitat:
Wir können Dir auch das Programm komplett schreiben, aber wo wäre da der Lerneffekt.
@ BadenPower

War das ein Angebot, wenn ich auf den Lerneffekt verzichte?
Im Ernst jetzt mal... ich weis, dass ihr oft mit Kindern zu tun habt, die einfach nur schnell alles fertig haben wollen und sich nicht für den sogenannten Lerneffekt interessieren.
Ich möchte mir verbieten, dass du mich mit jenen auf eine Stufe stellst, denn ich habe schon in einem der ersten Posts erwähnt, dass ich nichts fertiges möchte.
Andererseits möchte ich auch kein 3 Jahres-Kurs belegen müssen um noch dieses Jahr an mein Ziel zu kommen.
Ich erwarte von niemandem, dass er mir fertigen Code generiert, den ich nur noch CopyPasten muss um dann so zu tun als wenn ich der tollste bin weil es ja irgendwie läuft. Da habe ich doch nicht im Geringsten etwas von, wenn ich einmal etwas ändern muss.
Ich kam hierher in der Hoffnung, dass mir auf einfache Art erklärt wird, was ich tun muss um ein paar Informationen von einem Gameserver zu bekommen. Und ich habe nicht ansatzweise damit gerechnet, auch nur diesen MONAT damit fertig zu werden.
Das ich alleine mit dem WORT "Gameserver" in eine Schublade gesteckt werden würde, war mir schon VOR der Thread-Erstellung klar.

Ich bitte dich nun, dich diesem Thema fernzuhalten, wenn du keine produktiven weiterführenden Informationen zur Verfügung stellen möchtest oder kannst. Ich werde dir nicht Mehr Offtopic antworten

MFG
Flo
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Query an Gameserver

  Alt 22. Feb 2015, 23:55
Entschuldige, dass ich Delphi nicht wie meine Muttersprache beherrsche.
Das ist auch nicht schlimm ... Sprachen und Bibliotheken kommen und gehen. Aber als Entwickler/Programmierer ist man zu einem großem Teil Problemlöser. Deine Fragen deuten darauf hin, dass in deinem Entwickler-Werkzeugkasten noch ein paar wichtige Werkzeuge fehlen. Daher also der ganze "Belehrungskram"

Zu den Fehlern:
  1. Ich würde mutmaßen, dass deine Delphiversion nicht mit den typisierten Konstanten im Case zurechtkommt. Probiere es mal ohne die Typen oder benutze stattdessen if-then-else-if...
  2. Diese beiden Funktionen bekommen den "Rest" des Streams und sollten von dir selbst geschrieben werden.
Der Code von Sir Rufo ist eben nur ein Beispiel wie man so etwas angehen kann.
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Query an Gameserver

  Alt 24. Feb 2015, 11:34
Ich habe es jetzt gelöst bekommen, dass alles ausgelesen wird, auch wenn noch keine Map geladen ist oder keine Spieler vorhanden sind. Problem war ja dass dann "00" ausgegeben wird und sich das Array dann verschiebt. Sicherlich ist es unschön, aber es funktioniert. Für Verbesserungsvorschläge bin ich gerne offen.

Einziges Problem ist jetzt folgendes:
Der Server startet 4 Mal am Tag neu. um 06:00, 12:00, 18:00 und 00:00 Uhr.
Wenn man zu diesen Zeitpunkten den Query ausführt, hängt sich das Programm auf.

Hier der Code:
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var
A: TStringList;
udp: TUdpSocket;
x: array[0..25] of byte;
y: array[0..1400] of byte;
i: integer;
buff_delemitted: string;
startbit: integer;
endbitbit: integer;
stringcounter: integer;
begin
memo1.Clear;
udp := TUdpSocket.Create(Self);
udp.RemoteHost:= edit1.Text;
udp.RemotePort:= edit2.Text;
udp.Active:= true;

x[0]:= $FF;
x[1]:= $FF;
x[2]:= $FF;
x[3]:= $FF;
x[4]:= $54;
x[5]:= $53;
x[6]:= $6F;
x[7]:= $75;
x[8]:= $72;
x[9]:= $63;
x[10]:= $65;
x[11]:= $20;
x[12]:= $45;
x[13]:= $6E;
x[14]:= $67;
x[15]:= $69;
x[16]:= $6E;
x[17]:= $65;
x[18]:= $20;
x[19]:= $51;
x[20]:= $75;
x[21]:= $65;
x[22]:= $72;
x[23]:= $79;
x[24]:= $00;

udp.SendBuf(x,sizeof(x));

udp.ReceiveBuf(y,sizeof(y));

udp.Active := false;

for i := 4 to sizeof(y) - 1 do begin

// Header Lesen
  if (i = 3) then
  begin
    if IntToHex(y[0], 2) + IntToHex(y[0], 1) + IntToHex(y[2], 2) + IntToHex(y[3], 2) = 'FFFFFFFFthen
      begin
       buff_delemitted := buff_delemitted + 'FFFFFFFF;';
      end;
    if IntToHex(y[0], 2) + IntToHex(y[0], 1) + IntToHex(y[2], 2) + IntToHex(y[3], 2) = 'FFFFFFFEthen
      begin
       buff_delemitted := buff_delemitted + 'FFFFFFFE;';
      end;
  end
// Antwort
  else
  if (IntToHex(y[i], 2) = '49') then
  begin
    buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';'
  end
// Protokoll
  else
  if i = 5 then
  begin
    buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';'
  end
// Strings aufteilen nach 00
  else
  if (IntToHex(y[i], 2) = '00') then
  begin
    stringcounter := stringcounter +1;
// Erste 4 Strings aufteilen
    if stringcounter < 5 then buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';';
// Game ID Player und Max Player -> 0 Player keine Ausgabe "00" und würde Array verschieben
    if stringcounter = 5 then
    begin
      if IntToHex(y[i+2], 2) = '00then
      buff_delemitted := buff_delemitted + IntToHex(y[i], 2)
      else
      buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';';
    end;
// Restliche Strings werden korrekt getrennt
    if stringcounter > 5 then buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';';
  end
  else
  begin
    buff_delemitted := buff_delemitted + IntToHex(y[i], 2)
  end;

  Application.ProcessMessages;
end;

// HEX in Memo anzeigen zur Kontrolle
Memo1.Text := buff_delemitted;

A := TStringList.Create;
try
Split(';', buff_delemitted, A) ;
  server_header := HexStrToString(a[0]);
  server_protocol := inttostr(hextoint(a[1]));
  server_protocol := IntToStr(HexToInt(a[1]));
  server_name := HexStrToString(a[2]);
  server_map := HexStrToString(a[3]);
  server_folder := HexStrToString(a[4]);
  server_game := HexStrToString(a[5]);
  server_ID := inttostr(hextoint(a[6][3] + a[6][4] + a[6][1] + a[6][2]));
  server_players := inttostr(hextoint(a[6][5] + a[6][6]));
  server_max_players := inttostr(hextoint(a[6][7] + a[6][8]));
  server_bots := inttostr(hextoint(a[6][9] + a[6][10]));
  server_type := HexStrToString(a[7][1] + a[7][2]);
  server_environment := HexStrToString(a[7][3] + a[7][4]);
  server_visibility := inttostr(hextoint(a[7][5] + a[7][6]));
  server_VAC := inttostr(hextoint(a[8]));
  server_version := inttostr(hextoint(a[11][3] + a[6][4] + a[6][1] + a[6][2]));
  server_ExtraDataFlag := '';
  server_EDF_port := '';
  server_EDF_steamID := '';
  server_EDF_keywords := '';
  server_EDF_gameID := '';

  lblServerHeader.Caption := server_header;
  lblServerProtocol.Caption := server_protocol;
  lblServerName.Caption := server_name;
  lblServerMap.Caption := server_map;
  lblServerFolder.Caption := server_folder;
  lblServerGame.Caption := server_game;
  lblServerID.Caption := server_id;
  lblServerPlayers.Caption := server_players;
  lblServerMaxPlayers.Caption := server_max_players;
  lblServerBots.Caption := server_bots;
  lblServerType.Caption := server_type;
  lblServerEnvironment.Caption := server_environment;
  lblServerVisibility.Caption := server_visibility;
  lblServerVAC.Caption := server_VAC;
  lblServerVersion.Caption := server_version;
finally
  A.Free;
end;

end;
Danke nochmal für die Hilfe bisher an alle die geholfen haben.
Flo
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: Query an Gameserver

  Alt 24. Feb 2015, 12:36
Prüfe nach udp.Active:= true; (besser wäre udp.Open; ), ob die Verbindung überhaupt hergestellt werden konnte.

Delphi-Quellcode:
udp.Open;

if (udp.Connected) then
 begin
  x[0]:= $FF;
  x[1]:= $FF;
  //...
  udp.SendBuf(x,sizeof(x));

  //...

 end;
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Query an Gameserver

  Alt 24. Feb 2015, 12:55
ja das hat super funktioniert

Schlussendlich benötige ich doch noch eine bessere Variante um die Einzelnen Stellen der Antwort auszulesen. So, wie man die Informationen von einem Gameserver per Query abfragen kann, kann man auch die globale serverliste beim Masterserver per Query abfragen. dieses Script habe ich ebenfalls in PHP vorliegen.
Hier ein Link zum Script das die Serverliste anzeigt (Laden dauert etwas):
http://last-templers.de/a2epoch/serverlist.php
Nicht alle Server in der Liste funktionieren.

Problem besteht in den letzten Bytes, die angeben ob der Server Passwortgeschützt ist und ob VAC aktiviert ist.

Code:
Bei Servern OHNE Passwort (647700;00;) funktioniert mein Code.
Bei Servern MIT Passwort (64770100;) funktioniert mein code natürlich nicht, da die letzten Strings des Array dann verschoben werden.
Ich kann das auch mit einer IF ELSE Abfrage lösen, aber irgendwie scheint mir das ganze ziemlich "dreckig" programmiert.
Die einen mögen jetzt sagen: "Funktioniert doch, lass es so" .

Andererseits verstehe ich die Funktion von Sir Rufo nicht so ganz. Ehrlich gesagt garnicht.

Klar ist schon, dass er nur den Header ausliest und überprüft ob die Antwort Gesplittet ist oder nicht. Ich stocke schon an dem punkt, wie ich die ersten 4 Strings, die ja variable Längen haben, auslesen oder definieren soll.

Das mit dem TMemoryStream hatte ich schon probiert. Da kam bei mir nur Gemurkse bei raus.
Da blicke ich nicht durch.
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Query an Gameserver

  Alt 24. Feb 2015, 13:14
Ein kleines Beispiel:

Delphi-Quellcode:
var
  mem: TMemoryStream;
  intVar, intVarLesen: Integer;
  boolVar, boolVarLesen: Boolean;
begin
  boolVar := true;
  intVar := 123;
 
  mem := TMemoryStream.Create;
  try
    // Integer schreiben
    mem.Write(intVar, SizeOf(Integer));
    // Boolean schreiben
    mem.Write(boolVar, SizeOf(Boolean));
    
    // Vor dem auslesen den Stream an den Anfang positionieren
    mem.Position := 0;

    // Daten in gleicher Reihenfolge auslesen wie sie eingelesen wurden
    mem.Read(intVarLesen, SizeOf(Integer));
    mem.Read(boolVarLesen, SizeOf(Integer));
  finally
    mem.Free;
  end;
end;
Was du wahrscheinlich machen könntest wär sowas wie:

Delphi-Quellcode:
var
  PreHeader: Array[0..3] of Byte;
  Header: Byte;
  Protocol: Byte;
  tmpChar: AnsiChar;
  ServerName: AnsiString;
begin
  mem.SetSize({größe des Antwortpakets});
  udp1.ReceiveBuf(mem.Memory^, mem.Size);
  
  mem.Position := 0;

  mem.Read(PreHeader[0], SizeOf(PreHeader)); // FF FF FF FF
  mem.Read(Header, SizeOf(Byte));
  mem.Read(Protocol, SizeOf(Byte));

  // Aus folgenden kann/sollte man ne Funktion machen
  ServerName:= '';
  repeat
    mem.Read(tmpChar, SizeOf(AnsiChar));
    if (tmpChar <> #0) then
      ServerName:= ServerName + tmpChar;
  until tmpChar = #0;

  // usw..
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Query an Gameserver

  Alt 24. Feb 2015, 13:43
Das Funktionierende war auf die Verbindungsproblematik bezogen. Dies funktioniert jetzt schon soweit, dass wenn der Server nicht erreichbar ist, einfach nichts ausgewertet wird. Ändere ich den Queryport aber auf den Spielport zB, dann hängts immernoch.

Delphi-Quellcode:
  ServerName:= '';
  repeat
    mem.Read(tmpChar, SizeOf(AnsiChar));
    if (tmpChar <> #0) then
      ServerName:= ServerName + tmpChar;
  until tmpChar = #0;
da würde spätestens unten bei den Bytes nach den Strings dann wieder die Problematik aufkommen:

Mit Passwort: 8A 84 01 40 00 64 77 01 00

8A84 = Version
01 = Spieler aktuell
40 = Spieler max.
00 = Bots
64 = Typ
77 = Environment
01 = Passwort
00 = VAC status

Ohne Passwort: 8A 84 01 40 00 64 77 00

8A84 = Version
01 = Spieler aktuell
40 = Spieler max.
00 = Bots
64 = Typ
77 = Environment
--> PASSWORT FEHLT
00 = VAC status

Ebenso verhällt es sich bei den aktuellen Spielern auf dem Server. die werden auch als 00 gesendet und somit würden sie dann nur als "stop" für den Stream behandelt werden.
Flo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Query an Gameserver

  Alt 24. Feb 2015, 13:31
Du solltest dir mal TMemoryStream oder TByteStream anschauen.
Das was du da machst kann man damit um einiges übersichtlicher/besser/einfacher lösen.

Deine ganzen Hexstrings sind total unnötig
ja das hat super funktioniert
Schön, dann ist ja gut (aber was ist damit konkret gemeint?
Schlussendlich benötige ich doch noch eine bessere Variante um die Einzelnen Stellen der Antwort auszulesen. So, wie man die Informationen von einem Gameserver per Query abfragen kann, kann man auch die globale serverliste beim Masterserver per Query abfragen. dieses Script habe ich ebenfalls in PHP vorliegen.
Hier ein Link zum Script das die Serverliste anzeigt (Laden dauert etwas):
http://last-templers.de/a2epoch/serverlist.php
Nicht alle Server in der Liste funktionieren.

Problem besteht in den letzten Bytes, die angeben ob der Server Passwortgeschützt ist und ob VAC aktiviert ist.

Code:
Bei Servern OHNE Passwort (647700;00;) funktioniert mein Code.
Bei Servern MIT Passwort (64770100;) funktioniert mein code natürlich nicht, da die letzten Strings des Array dann verschoben werden.
Ich kann das auch mit einer IF ELSE Abfrage lösen, aber irgendwie scheint mir das ganze ziemlich "dreckig" programmiert.
Die einen mögen jetzt sagen: "Funktioniert doch, lass es so" .
Das was ich bisher von Deinem Programm gesehen habe, war nun wahrhaftig nicht als positives Codierungsbeispiel zu gebrauchen

Andererseits verstehe ich die Funktion von Sir Rufo nicht so ganz. Ehrlich gesagt garnicht.

Klar ist schon, dass er nur den Header ausliest und überprüft ob die Antwort Gesplittet ist oder nicht. Ich stocke schon an dem punkt, wie ich die ersten 4 Strings, die ja variable Längen haben, auslesen oder definieren soll.
Man könnte z.B. ein pAnsiChar auf das erste Zeichen eines String zeigen lassen und mit Hilfe dieses Pointers den String auslesen.
Aber so lange wir nicht wissen wie Dein Programm jetzt aussieht, ist das eigentlich nur unverbindliches Geblubber.

[OT]
Bevor man sich an's programmieren macht, ist es kein Fehler zunächst einmal die zu verarbeitenden Daten zu analysieren, und diese Datenstruktur zu beschreiben. Oft ergeben sich dan ein oder zwei (Record-)Definitionen mit denen dann auf einmal alles ganz einfach ist. Ein kleines Beispiel hierzu ist #32.
[/OT]


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Query an Gameserver

  Alt 24. Feb 2015, 16:06
Ich bin immer noch komplett baff, was du mit diesen ganzen völlig beknackten Umwandlungen nach Hex willst. Die sind ÜBER! Hier, das folgende zusammengetippert, indem ich mir die Struktur von der Valve-Seite in meinen Editor kopiert habe, und daran den Record orientiert. Den mit Hilfe der Typinfos befüllen, und die Sache ist gelutscht. Was ein Gehampel hier.

Delphi-Quellcode:
TInfoRequest = packed record
  RequestHeader: Integer;
  PacketHeader: AnsiChar;
  Payload: array[0..19] of AnsiChar;
end;

TInfoResponse = record
  ResponseHeader: Integer;
  PacketHeader: Byte;
  Protocol: Byte;
  Name: String;
  Map: String;
  Folder: String;
  Game: String;
  ID: SmallInt;
  Players: Byte;
  MaxPlayers: Byte;
  Bots: Byte;
  ServerType: Byte;
  Environment: Byte;
  Visibility: Byte;
  VAC: Byte;
  Version: String;
end;

TBufferArray = array[0..1400] of Byte;


function GetString(aBuffer: TBufferArray; var aIndex: Integer): String;
var
  b: Byte;
begin
  result := '';
  repeat
    Move(aBuffer[aIndex], b, SizeOf(b));
    if b <> 0 then
      result := result + IntToStr(b);
    inc(aIndex);
  until b = 0;
end;

procedure GetInfo;
var
  request: TInfoRequest;
  response: TInfoResponse;
  buffer: TBufferArray;
  i: Integer;
begin
  request.RequestHeader := -1;
  request.PacketHeader := 'T';
  request.Payload := 'Source Engine Query'; // Von mir aus auch mit einer Konstante oder einem Ressourcestring
  request.Payload[19] := #0;
  
  Udp1.SendBuf(request, SizeOf(TInfoRequest));
  Udp1.ReceiveBuf(buffer, SizeOf(buffer));

  i := 0;
  Move(buffer[i], response.ResponseHeader, SizeOf(response.ResponseHeader)); inc(i, SizeOf(response.ResponseHeader));
  Move(buffer[i], response.PacketHeader, SizeOf(response.PacketHeader)); inc(i, SizeOf(response.PacketHeader));
  Move(buffer[i], response.Protocol, SizeOf(response.Protocol)); inc(i, SizeOf(response.Protocol));
  response.Name := GetString(buffer, i);
  response.Map := GetString(buffer, i);
  response.Folder := GetString(buffer, i);
  response.Game := GetString(buffer, i);
  Move(buffer[i], response.ID, SizeOf(response.ID)); inc(i, SizeOf(response.ID));
  Move(buffer[i], response.Players, SizeOf(response.Players)); inc(i, SizeOf(response.Players));
  Move(buffer[i], response.MaxPlayers, SizeOf(response.MaxPlayers)); inc(i, SizeOf(response.MaxPlayers));
  Move(buffer[i], response.Bots, SizeOf(response.Bots)); inc(i, SizeOf(response.Bots));
  Move(buffer[i], response.ServerType, SizeOf(response.ServerType)); inc(i, SizeOf(response.ServerType));
  Move(buffer[i], response.Environment, SizeOf(response.Environment)); inc(i, SizeOf(response.Environment));
  Move(buffer[i], response.Visibility, SizeOf(response.Visibility)); inc(i, SizeOf(response.Visibility));
  Move(buffer[i], response.VAC, SizeOf(response.VAC)); inc(i, SizeOf(response.VAC));
  response.Version := GetString(buffer, i);

  // In response steht jetzt alles richtig schön drin. Nicht als Hexkacke, sondern sauber als der Typ, den Valve vorgibt.
end;
(Komplett ungetestet und im Editor geschrieben. Mag gut sein, dass da 1-2 Dinge nicht 100%ig hin kommen. Aber NOCH mehr vorkauen geht fast nicht.)
Edit: War alles hübsch eingerückt, aber der "Beautifyer" der DP ist da ja anderer Meinung. Wenn man den Beitrag zitiert wird's besser.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (24. Feb 2015 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Query an Gameserver

  Alt 24. Feb 2015, 12:53
Du solltest dir mal TMemoryStream oder TByteStream anschauen.
Das was du da machst kann man damit um einiges übersichtlicher/besser/einfacher lösen.

Deine ganzen Hexstrings sind total unnötig
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz