Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP Client empfangen (https://www.delphipraxis.net/191612-tcp-client-empfangen.html)

Bamer 1. Feb 2017 17:49

TCP Client empfangen
 
Guten Abend,

ich komme leider gar nicht weiter ich versuche schon den ganzen Tag herrauszufinden wie ich etwas mit dem Client empfangen kann.

Delphi-Quellcode:

procedure TForm1.sendBefehl(Befehl: string);
var Packet: Array of Byte;
    bytes: TIdBytes;
    i:integer;
begin
  SetLength(Packet, 13 + length(Befehl));
  SetLength(bytes, 13 + length(Befehl));
  for i:=1 to 11 do //Von Valve vorgegeben =0
    begin
      Packet[i]:=0;
    end;
  Packet[0] := 9 + length(Befehl); //Packet Size
  Packet[8] := 2; // Packet Type (SERVEREXEC)
  Packet[19] := 0; // Null terminator

  for i:=12 to (length(Befehl)+11) do //Befehl in die Packet schreiben
    begin
      Packet[i] := TEncoding.Default.GetBytes(Befehl[(i-11)])[0];
    end;
  move(Packet[0], bytes[0], 13 + length(Befehl)); //Packet in TIdBytes zum versenden
  idTCPClient1.IOHandler.Write(bytes);         //senden
  Memo1.Lines.Add(IntToStr(idTCPClient1.IOHandler.ReadByte)) //<-----Hier
end;

Ich sende dies an einen CSGO Server einen RCON Befehl der alle Bots kicken soll, das funktioniert auch.
Der Server schickt mir auch eine Antwort die ich mit Wireshark mir angeschaut habe, aber mit dem Befehl den ich benutze bekomme ich als Antwort "10"
Obwohl sie Kicked Bot ... ... heissen sollte.

Hier der Auszug von Wireshark wo der Server mir eine Antwort
https://gyazo.com/42a46ce76955ff366fb77cb3a242ffca



Ich hoffe ich hab es etwas verständlich erklärt und das ihr vll ein paar Ideen habt :)

Danke im Vorraus


MfG Bamer

Der schöne Günther 1. Feb 2017 17:57

AW: TCP Client empfangen
 
Ich denke doch dass ein Befehl mit dem Namen "ReadByte" auch nur ein einziges Byte liest.

Du willst doch wohl, ebenso wie du das mit deinem Request gemacht hast, einen Haufen Bytes der Text enthält, empfangen. Hier wäre die Frage ob die Antwort vom Server hierauf jetzt eine feste Anzahl von Bytes ist oder ob z.B. das erste Byte (deine "10") angibt wieviele Bytes noch folgen sollen.

Was sagt die Doku zu CSGo-Servern?

Bamer 1. Feb 2017 18:32

AW: TCP Client empfangen
 
Also ich habe keine Ahnung wieso eine 10 kommt

Ich habe 2 Antworten vom CSGO Server bekommen.

Einmal die Länge 1412 und einmal 260.

https://developer.valvesoftware.com/..._and_Responses <- Meinst du das mit Doku? Daraus werd ich auch nicht schlau es hat mir beim senden geholfen aber beim empfangen nicht


EDIT
Delphi-Quellcode:
procedure TForm1.sendBefehl(Befehl: string);
var Packet: Array of Byte;
    Packet2: Array of Byte;
    bytes: TIdBytes;
    bytes2: TIdBytes;
    i:integer;
    i2:integer;
begin
  SetLength(Packet, 13 + length(Befehl));
  SetLength(bytes, 13 + length(Befehl));
  for i:=1 to 11 do //Von Valve vorgegeben =0
    begin
      Packet[i]:=0;
    end;
  Packet[0] := 9 + length(Befehl); //Packet Size
  Packet[8] := 2; // Packet Type (SERVEREXEC)
  Packet[19] := 0; // Null terminator

  for i:=12 to (length(Befehl)+11) do //Befehl in die Packet schreiben
    begin
      Packet[i] := TEncoding.Default.GetBytes(Befehl[(i-11)])[0];
    end;
  move(Packet[0], bytes[0], 13 + length(Befehl)); //Packet in TIdBytes zum versenden
  idTCPClient1.IOHandler.Write(bytes);         //senden
  idTCPClient1.IOHandler.ReadBytes(bytes2,i2,true);
  Memo1.Lines.Add(IntToStr(High(bytes2)));

  move(bytes2[0], packet2[0], High(bytes2));
  for i2:=0 to High(bytes2) do
    begin
      Memo1.Lines.Add(IntToStr(packet2[i]));
    end;


  //Memo1.Lines.Add (idTCPClient1.IOHandler.ReadLn());
end;
wollte mal testen wenn ich Bytes benutze da sollte ja eig mehr kommen, aber leider crasht dann die exe :/

Sherlock 2. Feb 2017 06:48

AW: TCP Client empfangen
 
Indy sind etwas für anspruchsvolle Entwickler. Versuchs mal mit Overbytes ICS, das ist deutlich intuitiver, und IMHO näher an Delphis Eventmodell.

Sherlock

kompi 2. Feb 2017 08:11

AW: TCP Client empfangen
 
Ich habe vor kurzem auch die Indy Komponente TCP Client benutzt.

Um eine Antwort vom Server auswerten zu können, muss man erst mal etwas warten. Dies kann man mit checkfordataonsource des IO - Handlers machen. Als Parameter kann man die Wartezeit angeben. Die Antworten vom Server landen bei mir 9im Inputbuffer, den man sehr bequem mit der Methode inputbufferasstring auslesen kann. Zusätzlich kann man hier noch einen Parameter zum Encoding angeben.

Ich hoffe, so funktioniert es.

Gruß Kompi

Der schöne Günther 2. Feb 2017 09:03

AW: TCP Client empfangen
 
Du steckst in
Delphi-Quellcode:
ReadBytes(..)
sowohl ein nicht initialisiertes Array als auch den nicht initialisierten Wert i2 (Anzahl zu lesende Bytes). Schau doch nochmal genau wie man das macht:

http://www.indyproject.org/docsite/h...r@boolean.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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