Ok ich habe mir nochmal ein paar Gedanken gemacht und bin auf Sachen gestoßen, die eigentlich keinen Sinn machen.
Dazu hier ein kleines Beispiel, auf das ich mich beziehen werde.
Bsp.:
Delphi-Quellcode:
procedure SendCommand(Command: string);
var Packet: Array[0..19] of Byte;
bytes: TIdBytes;
begin
Command := 'passwrd';
//SetLength(Packet, 13 + length(Command));
Packet[0] := 9 + length(Command); //Packet Size
Packet[1] := 0;
Packet[2] := 0;
Packet[3] := 0;
Packet[4] := 0; // Packet ID (Positiv)
Packet[5] := 0;
Packet[6] := 0;
Packet[7] := 0;
Packet[8] := 3; // Packet Type (SERVERDATA_AUTH)
Packet[9] := 0;
Packet[10] := 0;
Packet[11] := 0;
Packet[12] := TEncoding.Default.GetBytes('p')[0]; // Body
Packet[13] := TEncoding.Default.GetBytes('a')[0];
Packet[14] := TEncoding.Default.GetBytes('s')[0];
Packet[15] := TEncoding.Default.GetBytes('s')[0];
Packet[16] := TEncoding.Default.GetBytes('w')[0];
Packet[17] := TEncoding.Default.GetBytes('r')[0];
Packet[18] := TEncoding.Default.GetBytes('d')[0];
Packet[19] := 0; // Null terminator
SetLength(bytes, 20);
move(Packet, bytes[0], 20);
Form1.idTCPClient1.IOHandler.Write(bytes);
end;
1. Packet Size
Diese soll die Größe des
TCP Packets sein - 4 Bytes, da Packet Size nicht mitgezählt wird
Zitat:
Note that the packet size field itself is not included when determining the size of the packet, so the value of this field is always 4 less than the packet's actual length
Desweiteren muss die Größe mindestens 10 Bytes sein.
Zitat:
The minimum possible value for packet size is 10
Das heißt, das die Größe in meinem Beispiel 15 sein müsste.
Warum wird dann im Beispiel von Steam einfach "length(Command) + 9" genommen?
Das wäre ja dann nur Glück.
Packet(0) = Command.Length + 9 'Packet Size (Integer)
2. Array of Byte zu TIdBytes
Wie mir ja schon richtig geraten wurde, muss ich das Array ja als TIdBytes senden.
Dazu habe ich oben in meinem Beispiel die meiner Meinung nach richtige Lösung.
Warum wurde mir auf der ersten Seite das hier vorgeschlagen?
Delphi-Quellcode:
SetLength(bytes, rconpacket.Size);
Move(rconpacket, bytes[0], rconpacket.Size);
Wenn ja Packet Size immer 4 Bytes kleiner ist als die eigentliche Länge, macht es ja keinen Sinn diese zu kopieren.
3. Statisches und dynamisches Array
Oben in meinem Speispiel verwende ich ein statisches Array.
Doch da die länge von "Command" ja unterschiedlich ist, müsste ich ja eigentlich dein dynamisches Array benutzen, was ich oben ja als Kommentar eingetragen habe.
(Natürlich habe ich "Packet: Array[0..19] of Byte;" zu "Packet: Array of Byte;" geändert.
Doch wenn ich das benutze, bekomme ich ganz wirre Zeichen angezeigt, wenn ich mir den Traffic ansehe.
Das heißt, dass ja dann irgendwas nicht richtig kopiert wird.
Ich habe jetzt oben meine Methode benutzt, aber bekomme wie schon im Post davor keine Antwort vom Server auf den Befehl "status".
Nach der abgeänderten Version sieht der Traffic jetzt so aus:
Code:
............passwrd.
.............
.........................status.
Packet Typ habe ich beim Befehl "status" natürlich von 3 auf 2 geändert.