AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCP Verbindug und RCON

Ein Thema von SyntaxXx · begonnen am 8. Jul 2013 · letzter Beitrag vom 22. Jul 2013
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: TCP Verbindug und RCON

  Alt 9. Jul 2013, 16:23
Und warum die Sprünge von [0] zu [4] zu [8] zu [12 + x] ?
Weil die "schlampern" und nur das niederwertigste Byte befüllen anstatt [0]-[3] usw.
Delphi-Quellcode:
TRconPacket=record
     Size :integer;
     ReqID :integer;
     PacketType :Integer; // fehlt noch
     data :array [0..4095-12]of byte;
end;
fork me on Github
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#2

AW: TCP Verbindug und RCON

  Alt 9. Jul 2013, 22:52
Ok vielen Dank.
Ich habe mir schon fast gedacht, dass es sich um ein Array handeln muss.

Aber nur zum Verständnis.
Der Record ist aber doch eigentlich nicht notwendig oder?

Es würde doch dann ganz einfach auch reichen, wenn ich das Array fülle.
Delphi-Quellcode:
  data[0] := length(Command) + 9;
  data[4] := 0;
  data[8] := 3;

  for i := 0 to length(Command) - 1 do
    RCON.data[12 + i] := TEncoding.Default.GetBytes(Command[i])[0];
Zum Schluss müsste ich doch dann nur noch das Array versenden.
idTCPClient1.IOHandler.Write(); Die Frage ist aber jetzt, wie ich das Array versende.
Ich habe hier jetzt ...Write() genommen, weil hier "TIdBytes" erwartet wird.

Aber ich verstehe nicht, wie ich das komplette Array versenden kann.
...Write(data[0]); funktioniert zwar, aber da sende ich ja nicht die komplette Anfrage.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: TCP Verbindug und RCON

  Alt 10. Jul 2013, 10:09
Es würde doch dann ganz einfach auch reichen, wenn ich das Array fülle.
Entscheidend ist was hinten rauskommt.
Aber du "schlamperst" jetzt auch.
Wer sagt denn, dass data[1] = 0 ist?
Es hängt vom Zufall ab.
Delphi-Quellcode:
  data[0] := length(Command) + 9;
  data[1] := 0; // *
  data[2] := 0; // *
  data[3] := 0; // *
  data[4] := 0;
Was machst du, wenn die Länge des "Command" mal den Wert von 256-9 überschreiten sollte?
Der Record hat den Vorteil, dass die Struktur klar festgelegt ist.

Keine Ahnung weshalb man Indy nicht eine Write-Funktion spendiert hat, mit der man beliebige Datentypen schreiben kann (so wie bei TStream.Write()).
Dann muss man halt kopieren:
Delphi-Quellcode:
var
  bytes : TIdBytes;
  rconpacket : TRconPacket;
begin
  ...
  SetLength(bytes, rconpacket.Size);
  Move(rconpacket, bytes[0], rconpacket.Size);
  idTCPClient1.IOHandler.Write(bytes);
fork me on Github
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#4

AW: TCP Verbindug und RCON

  Alt 10. Jul 2013, 21:13
Ok soweit habe ich das jetzt umgesetzt und benutze jetzt ein Record.
Habe es jetzt auch in ein "Array of Byte" (TIdBytes) kopiert, so wie du es gezeigt hast.

Doch irgendwie nörgelt der Compiler noch rum:

Delphi-Quellcode:
type
  TIdBytes = array of Byte;
  ....
Delphi-Quellcode:
...
idTCPClient1.IOHandler.Write(bytes);
...
Zitat:
[dcc32 Fehler] Unit1.pas(72): E2250 Es gibt keine überladene Version von 'Write', die man mit diesen Argumenten aufrufen kann
Aber warum?
Ich habe doch alles so gemacht, wie es von ...Write() erwartet wird, oder übersehe ich hier noch was?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: TCP Verbindug und RCON

  Alt 10. Jul 2013, 22:05
TIdBytes ist in Unit IdGlobal deklariert.
Diese Unit muss eingebunden werden (TIdBytes nicht selbst deklarieren!).

Strg-Taste gedrückt halten und auf das ".write" klicken.
Die IDE müsste dann die richtige Unit (IdIoHandler.pas oder so) öffnen und den Sourcecode für alle überladenen write()-Funktionen anzeigen.

Eine Write()-Funktion müsste so deklariert sein:
procedure Write(ABuffer: TIdBytes); virtual; overload;
fork me on Github
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#6

AW: TCP Verbindug und RCON

  Alt 14. Jul 2013, 20:52
Wie nicht anders zu erwarten war, hattest du natürlich recht.
Doch ich stoße noch auf ein weiteres Problem.

Wenn ich mir die Größe des Arrays ausgeben lasse, bekomme ich 4088 angezeigt, was ja alles Regelkonform wäre.
Doch wenn ich die Variable bytes mit setlength ändern will, gibt diese mir immer nur 4 aus, was ja dann nicht passt.

Kann es sein, dass ich in diesem Falle nicht mit setlength arbeiten kann?


Edit:
Natürlich muss ich length() nehmen, um die Länge festzustellen.
Dann muss ich mal weiter schauen, wieso die Verbindung immer noch sofort geschlossen wird.

Geändert von SyntaxXx (14. Jul 2013 um 21:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: TCP Verbindug und RCON

  Alt 15. Jul 2013, 13:59
Also irgenwie lässt du dich bluffen; die Variable bytes:TIdBytes ist ein Zeiger, der 4 Bytes benötigt.
Es zeigt aber auf einen Speicherbereich der die Länge hat, die man zuvor mit SetLength reserviert hat.
SizeOf() und Length() geben unterschiedliche Ergebnisse zurück!

Bevor du die Daten wegschickst wäre es sinnvoll sie in einer Datei zu speichern, die du dann mit einem Debugger anschauen kannst.
Delphi-Quellcode:
var
  bytes : TIdBytes;
  rconpacket : TRconPacket;
  fs : TFileStream;
begin
  ...
  SetLength(bytes, rconpacket.Size);
  Move(rconpacket, bytes[0], rconpacket.Size);

  // zum Debuggen die Daten in Datei schreiben
  fs := TFileStream.Create('RCON_Out.dat', fmCreate);
  fs.Writebuffer(bytes[0], Length(bytes));
  fs.Free;

  idTCPClient1.IOHandler.Write(bytes);
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:22 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