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
Seite 1 von 2  1 2      
SyntaxXx

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

TCP Verbindug und RCON

  Alt 8. Jul 2013, 20:51
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?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

AW: TCP Verbindug und RCON

  Alt 8. Jul 2013, 22:07
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.
fork me on Github
  Mit Zitat antworten Zitat
SyntaxXx

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

AW: TCP Verbindug und RCON

  Alt 9. Jul 2013, 14:47
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] ?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: TCP Verbindug und RCON

  Alt 9. Jul 2013, 15:50
Packet wird hier als Byte deklariert.
ÄH nee, ist ein Array of byte

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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 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
 
#6

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
 
#7

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
 
#8

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
 
#9

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
 
#10

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
Antwort Antwort
Seite 1 von 2  1 2      


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 14:21 Uhr.
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