Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TCP Verbindug und RCON (https://www.delphipraxis.net/175667-tcp-verbindug-und-rcon.html)

SyntaxXx 8. Jul 2013 20:51

TCP Verbindug und RCON
 
Nabend,
ich möchte ein simples Tool coden, das via TCP Verbindung RCON Befehle an meinen Server sendet.

Dazu folgender Code:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Antwort: string;
begin
  idTCPClient1.Host := '46.XX.211.XX';
  idTCPClient1.Port := 27015;
  idTCPClient1.Connect;
    //Antwort := idTCPClient1.IOHandler.ReadLn();
    //showmessage(Antwort);

    idTCPClient1.IOHandler.WriteLn('#255#255#255#255 status');
    Antwort := idTCPClient1.IOHandler.ReadLn();
    showmessage(Antwort);
  idTCPClient1.Disconnect;
end;
Doch wenn ich auf den Button 2 klicke, bekomme ich sofort die Meldung "Die Verbindung wurde erfolgreich geschlossen".
Ohne auch nur einmal eine Messagebox zu bekommen.

Es liegt an der Zeile "Antwort := idTCPClient1.IOHandler.ReadLn();".

Könnt ihr mir verraten, warum ich keine Antwort vom Server bekomme, bzw. wieso die Verbindung an dieser Stelle schon geschlossen wird?

sx2008 8. Jul 2013 22:07

AW: TCP Verbindug und RCON
 
Du schickst keine gültigen RCON - Daten; siehe https://developer.valvesoftware.com/...cket_Structure .
Das Feld Size ist bei dir gleich -1 ($FFFFFFFF), erlaubt sind aber nur Werte zwischen 10 und 4096.
Also trennt der Server die Verbindung.

SyntaxXx 9. Jul 2013 14:47

AW: TCP Verbindug und RCON
 
Ahhh ok, dann waren meine Quellen alle veraltet.

Ich hab mich nun dort ein wenig eingelesen und stoße wieder an meine Grenzen.
Die Beipsiele unten auf der Seite helfen mir auch nicht ganz.

Es muss also erst einmal ein TCP Paket erstellt werden.
In den Beipsielen wird hier die Variable "Packet" verwendet.

Packet wird hier als Byte deklariert.



Was genau soll denn aber nun das bedeuten: "Packet[0]"?
Wenn ich das 1:1 auf Delphi ummünze, wird mir gesagt, dass "Packet" kein Array ist, was ja auch einleuchtet.
Aber auf was wird denn hier mit [0] zugegriffen?

Und warum die Sprünge von [0] zu [4] zu [8] zu [12 + x] ?

p80286 9. Jul 2013 15:50

AW: TCP Verbindug und RCON
 
Zitat:

Zitat von SyntaxXx (Beitrag 1221265)
Packet wird hier als Byte deklariert.

ÄH nee, ist ein Array of byte

Zitat:

Zitat von SyntaxXx (Beitrag 1221265)
Und warum die Sprünge von [0] zu [4] zu [8] zu [12 + x] ?

Weil da die entsprechenden Grenzen der Felder sind.

Mein C ist nur rudimentär und mit Netz habe ich auch nichts am Hut aber Du brauchst etwas ähnliches wie

Delphi-Quellcode:
tmyRecord=
     laenge:integer;
     ReqID :integer;
     data :array [0..4095-8]of byte;
end;
Denk ich mir

Gruß
K-H

sx2008 9. Jul 2013 16:23

AW: TCP Verbindug und RCON
 
Zitat:

Zitat von SyntaxXx (Beitrag 1221265)
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;

SyntaxXx 9. Jul 2013 22:52

AW: TCP Verbindug und RCON
 
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.
Delphi-Quellcode:
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.

sx2008 10. Jul 2013 10:09

AW: TCP Verbindug und RCON
 
Zitat:

Zitat von SyntaxXx (Beitrag 1221299)
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);

SyntaxXx 10. Jul 2013 21:13

AW: TCP Verbindug und RCON
 
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?

sx2008 10. Jul 2013 22:05

AW: TCP Verbindug und RCON
 
Delphi-Quellcode:
TIdBytes
ist in Unit
Delphi-Quellcode:
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:
Delphi-Quellcode:
procedure Write(ABuffer: TIdBytes); virtual; overload;

SyntaxXx 14. Jul 2013 20:52

AW: TCP Verbindug und RCON
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz