![]() |
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:
Doch wenn ich auf den Button 2 klicke, bekomme ich sofort die Meldung "Die Verbindung wurde erfolgreich geschlossen".
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; 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? |
AW: TCP Verbindug und RCON
Du schickst keine gültigen RCON - Daten; siehe
![]() Das Feld Size ist bei dir gleich -1 ($FFFFFFFF), erlaubt sind aber nur Werte zwischen 10 und 4096. Also trennt der Server die Verbindung. |
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] ? |
AW: TCP Verbindug und RCON
Zitat:
Zitat:
Mein C ist nur rudimentär und mit Netz habe ich auch nichts am Hut aber Du brauchst etwas ähnliches wie
Delphi-Quellcode:
Denk ich mir
tmyRecord=
laenge:integer; ReqID :integer; data :array [0..4095-8]of byte; end; Gruß K-H |
AW: TCP Verbindug und RCON
Zitat:
Delphi-Quellcode:
TRconPacket=record
Size :integer; ReqID :integer; PacketType :Integer; // fehlt noch data :array [0..4095-12]of byte; end; |
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:
Zum Schluss müsste ich doch dann nur noch das Array versenden.
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];
Delphi-Quellcode:
Die Frage ist aber jetzt, wie ich das Array versende.
idTCPClient1.IOHandler.Write();
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. |
AW: TCP Verbindug und RCON
Zitat:
Aber du "schlamperst" jetzt auch. Wer sagt denn, dass data[1] = 0 ist? Es hängt vom Zufall ab.
Delphi-Quellcode:
Was machst du, wenn die Länge des "Command" mal den Wert von 256-9 überschreiten sollte?
data[0] := length(Command) + 9;
data[1] := 0; // * data[2] := 0; // * data[3] := 0; // * data[4] := 0; 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); |
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:
Ich habe doch alles so gemacht, wie es von ...Write() erwartet wird, oder übersehe ich hier noch was? |
AW: TCP Verbindug und RCON
Delphi-Quellcode:
ist in Unit
TIdBytes
Delphi-Quellcode:
deklariert.
IdGlobal
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;
|
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 09:23 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